From 337643e53e29b9862b92c6d73ce7a27975e79d02 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Wed, 4 Nov 2015 22:31:24 +0100 Subject: [PATCH 001/206] Accountancy : Correct errors of display in bank journal --- htdocs/accountancy/journal/bankjournal.php | 70 ++++++++++++++-------- 1 file changed, 46 insertions(+), 24 deletions(-) diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index c97cde97b14..bed5376064f 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -264,7 +264,7 @@ if ($result) { */ // Write bookkeeping -if ($action == 'writeBookKeeping') +if ($action == 'writebookkeeping') { $error = 0; foreach ( $tabpay as $key => $val ) @@ -406,10 +406,32 @@ if ($action == 'writeBookKeeping') } } // Export -if ($action == 'export_csv') -{ +if ($action == 'export_csv') { $sep = $conf->global->ACCOUNTING_EXPORT_SEPARATORCSV; - $bank_journal = $conf->global->ACCOUNTING_BANK_JOURNAL; + + // Journal + $bank = "SELECT rowid, label, accountancy_journal"; + $bank.= " FROM ".MAIN_DB_PREFIX."bank_account"; + $bank.= " WHERE entity = ".$conf->entity; + $bank.= " AND rowid = '".$id_accountancy_journal."'"; + + $resql = $db->query($bank); + if ($resql) + { + if ($db->num_rows($resql)) + { + $obj = $db->fetch_object($resql); + + $journal = $objp->accountancy_journal; + } + return 1; + } + else + { + dol_print_error($this->db); + return -1; + } + //$journal = $conf->global->ACCOUNTING_BANK_JOURNAL; header('Content-Type: text/csv'); header('Content-Disposition: attachment;filename=journal_banque.csv'); @@ -421,16 +443,16 @@ if ($action == 'export_csv') $sep = ";"; foreach ( $tabpay as $key => $val ) { - $date = dol_print_date($db->jdate($val["date"]), '%d%m%Y'); - - $companystatic->id = $tabcompany[$key]['id']; $companystatic->name = $tabcompany[$key]['name']; + $companystatic->client = $tabcompany[$key]['code_client']; + + $date = dol_print_date($db->jdate($val["date"]), '%d%m%Y'); // Bank foreach ( $tabbq[$key] as $k => $mt ) { print $date . $sep; - print $bank_journal . $sep; + print $journal . $sep; print length_accountg(html_entity_decode($k)) . $sep; print $sep; print ($mt < 0 ? 'C' : 'D') . $sep; @@ -448,7 +470,7 @@ if ($action == 'export_csv') if ($mt) { print $date . $sep; - print $bank_journal . $sep; + print $journal . $sep; if ($val["lib"] == '(SupplierInvoicePayment)') { print length_accountg($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER) . $sep; } else { @@ -470,8 +492,8 @@ if ($action == 'export_csv') if (1) { print $date . $sep; - print $bank_journal . $sep; - print $conf->global->ACCOUNTING_ACCOUNT_SUSPENSE . $sep; + print $journal . $sep; + print length_accountg($conf->global->ACCOUNTING_ACCOUNT_SUSPENSE) . $sep; print $sep; print ($mt < 0 ? 'D' : 'C') . $sep; print ($mt <= 0 ? price(- $mt) : $mt) . $sep; @@ -482,8 +504,7 @@ if ($action == 'export_csv') } } } - } else // Model Classic Export - { + } else { // Model Classic Export foreach ( $tabpay as $key => $val ) { $date = dol_print_date($db->jdate($val["date"]), 'day'); @@ -525,7 +546,7 @@ if ($action == 'export_csv') { print '"' . $date . '"' . $sep; print '"' . $val["ref"] . '"' . $sep; - print '"' . $conf->global->ACCOUNTING_ACCOUNT_SUSPENSE . '"' . $sep; + print '"' . length_accountg($conf->global->ACCOUNTING_ACCOUNT_SUSPENSE) . '"' . $sep; print '"' . $langs->trans("Bank") . '"' . $sep; print '"' . ($mt < 0 ? price(- $mt) : '') . '"' . $sep; print '"' . ($mt >= 0 ? price($mt) : '') . '"'; @@ -535,15 +556,13 @@ if ($action == 'export_csv') } } } -} -else -{ - +} else { $form = new Form($db); llxHeader('', $langs->trans("BankJournal")); $namereport = $langs->trans("BankJournal"); + $namereport.= " " . $journal; $description = $langs->trans("DescBankJournal"); $period = $form->select_date($date_start, 'date_start', 0, 0, 0, '', 1, 0, 1) . ' - ' . $form->select_date($date_end, 'date_end', 0, 0, 0, '', 1, 0, 1); @@ -553,9 +572,11 @@ else $head[$h][1] = $langs->trans("Report"); $head[$h][2] = 'report'; - dol_fiche_head($head, $hselected); + dol_fiche_head($head, 'report'); print '
'; + print ''; + print ''; // Title @@ -594,8 +615,8 @@ else print ''; - print ''; - + print ''; + print ' - - - - - - -TraceKit specific optional settings -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Usually there is no need to touch these settings, but they exist in case you need to tweak something. - -fetchContext ------------- - -Enable TraceKit to attempt to fetch source files to look up anonymous function names, this can be useful to enable if you don't get the context for some entries in the stack trace. Default value is ``false``. - -.. code-block:: javascript - - { - fetchContext: true - } - -linesOfContext --------------- - -The count of lines surrounding the error line that should be used as context in the stack trace, default value is ``11``. Only applicable when ``fetchContext` is enabled. - -.. code-block:: javascript - - { - linesOfContext: 11 - } - -collectWindowErrors -------------------- - -Enable or disable the TraceKit ``window.onerror`` handler, default value is ``true``. - -.. code-block:: javascript - - { - collectWindowErrors: true - } diff --git a/htdocs/includes/raven-js/docs/contributing/index.rst b/htdocs/includes/raven-js/docs/contributing/index.rst deleted file mode 100644 index 2b25abf7f16..00000000000 --- a/htdocs/includes/raven-js/docs/contributing/index.rst +++ /dev/null @@ -1,99 +0,0 @@ -Contributing -============ - -Setting up an Environment -~~~~~~~~~~~~~~~~~~~~~~~~~ - -To run the test suite and run our code linter, node.js and npm are required. If you don't have node installed, `get it here `_ first. - -Installing all other dependencies is as simple as: - -.. code-block:: sh - - $ npm install - -And if you don't have `Grunt `_ already, feel free to install that globally: - -.. code-block:: sh - - $ npm install -g grunt-cli - -Running the Test Suite -~~~~~~~~~~~~~~~~~~~~~~ - -The test suite is powered by `Mocha `_ and can both run from the command line, or in the browser. - -From the command line: - -.. code-block:: sh - - $ grunt test - -From your browser: - -.. code-block:: sh - - $ grunt run:test - -Then visit: http://localhost:8000/test/ - -Compiling Raven.js -~~~~~~~~~~~~~~~~~~ - -The simplest way to compile your own version of Raven.js is with the supplied grunt command: - -.. code-block:: sh - - $ grunt build - -By default, this will compile raven.js and all of the included plugins. - -If you only want to compile the core raven.js: - -.. code-block:: sh - - $ grunt build.core - -Files are compiled into ``build/``. - -Contributing Back Code -~~~~~~~~~~~~~~~~~~~~~~ - -Please, send over suggestions and bug fixes in the form of pull requests on `GitHub `_. Any nontrivial fixes/features should include tests. -Do not include any changes to the ``dist/`` folder or bump version numbers yourself. - -Documentation -------------- - -The documentation is written using `reStructuredText `_, and compiled using `Sphinx `_. If you don't have Sphinx installed, you can do it using following command (assuming you have Python already installed in your system): - -.. code-block:: sh - - $ pip install sphinx - -Documentation can be then compiled by running: - -.. code-block:: sh - - $ make docs - -Afterwards you can view it in your browser by running following command and than pointing your browser to http://127.0.0.1:8000/: - -.. code-block:: sh - - $ grunt run:docs - - - -Releasing New Version -~~~~~~~~~~~~~~~~~~~~~ - -* Bump version numbers in both ``package.json`` and ``bower.json``. -* ``$ grunt dist`` This will compile a new version and update it in the ``dist/`` folder. -* Confirm that build was fine, etc. -* Commit new version, create a tag. Push to GitHub. -* ``$ grunt publish`` to recompile all plugins and all permutations and upload to S3. -* ``$ npm publish`` to push to npm. -* Confirm that the new version exists behind ``cdn.ravenjs.com`` -* Update version in the ``gh-pages`` branch specifically for http://ravenjs.com/. -* glhf diff --git a/htdocs/includes/raven-js/docs/index.rst b/htdocs/includes/raven-js/docs/index.rst deleted file mode 100644 index afe07bc9ab9..00000000000 --- a/htdocs/includes/raven-js/docs/index.rst +++ /dev/null @@ -1,42 +0,0 @@ -Raven.js -======== - -Raven.js is a tiny standalone JavaScript client for `Sentry `_. - -**This version of Raven.js requires Sentry 6.0 or newer.** - - -Getting Started ---------------- - -.. toctree:: - :maxdepth: 2 - - install/index - plugins/index - config/index - usage/index - tips/index - -Developers ----------- -.. toctree:: - :maxdepth: 2 - - contributing/index - -What's New? ------------ -.. toctree:: - :maxdepth: 2 - - changelog/index - -Resources ---------- -* `Download `_ -* `Bug Tracker `_ -* `Code `_ -* `IRC `_ (irc.freenode.net, #sentry) -* :doc:`Changelog ` -* Follow `@mattrobenolt `_ on Twitter for updates! diff --git a/htdocs/includes/raven-js/docs/install/index.rst b/htdocs/includes/raven-js/docs/install/index.rst deleted file mode 100644 index 17feda4e08e..00000000000 --- a/htdocs/includes/raven-js/docs/install/index.rst +++ /dev/null @@ -1,61 +0,0 @@ -Installation -============ - -Raven is distributed in a few different methods, and should get included after any other libraries are included, but before your own scripts. - -So for example: - -.. parsed-literal:: - - - - - - -This allows the ability for Raven's plugins to instrument themselves. If included before something like jQuery, it'd be impossible to use for example, the jquery plugin. - -Using our CDN -~~~~~~~~~~~~~ - -We serve our own builds off of `Fastly `_. They are accessible over both http and https, so we recommend leaving the protocol off. - -Our CDN distributes builds with and without :doc:`plugins `. - -.. parsed-literal:: - - - -**We highly recommend trying out a plugin or two since it'll greatly improve the chances that we can collect good information.** - -This version does not include any plugins. See `ravenjs.com `_ for more information about plugins and getting other builds. - -Bower -~~~~~ - -We also provide a way to deploy Raven via `bower -`_. Useful if you want serve your own scripts instead of depending on our CDN and mantain a ``bower.json`` with a list of dependencies and versions (adding the ``--save`` flag would automatically add it to ``bower.json``). - -.. code-block:: sh - - $ bower install raven-js --save - -.. code-block:: html - - - -Also note that the file is uncompresed but is ready to pass to any decent JavaScript compressor like `uglify `_. - -npm -~~~ - -Raven is published to npm as well. https://www.npmjs.com/package/raven-js - -.. code-block:: sh - - $ npm install raven-js --save - -Requirements -~~~~~~~~~~~~ - -Raven expects the browser to provide `window.JSON` and `window.JSON.stringify`. In Internet Explorer 8+ these are available in `standards mode `_. -You can also use `json2.js `_ to provide the JSON implementation in browsers/modes which doesn't support native JSON diff --git a/htdocs/includes/raven-js/docs/make.bat b/htdocs/includes/raven-js/docs/make.bat deleted file mode 100644 index 13e2848a47d..00000000000 --- a/htdocs/includes/raven-js/docs/make.bat +++ /dev/null @@ -1,190 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=_build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\raven-js.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\raven-js.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -:end diff --git a/htdocs/includes/raven-js/docs/plugins/index.rst b/htdocs/includes/raven-js/docs/plugins/index.rst deleted file mode 100644 index 7a9df7b019e..00000000000 --- a/htdocs/includes/raven-js/docs/plugins/index.rst +++ /dev/null @@ -1,20 +0,0 @@ -Plugins -======= - -What are plugins? -~~~~~~~~~~~~~~~~~ - -In Raven.js, plugins are little snippets of code to augment functionality for a specific application/framework. It is highly recommended to checkout the list of plugins and use what apply to your project. - -In order to keep the core small, we have opted to only include the most basic functionality by default, and you can pick and choose which plugins are applicable for you. - -Why are plugins needed at all? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -JavaScript is pretty restrictive when it comes to exception handling, and there are a lot of things that make it difficult to get relevent information, so it's important that we inject code and wrap things magically so we can extract what we need. See :doc:`/usage/index` for tips regarding that. - - -All Plugins -~~~~~~~~~~~ -* https://github.com/getsentry/raven-js/tree/master/plugins -* `Download `_ diff --git a/htdocs/includes/raven-js/docs/tips/index.rst b/htdocs/includes/raven-js/docs/tips/index.rst deleted file mode 100644 index 8dee09eb7ef..00000000000 --- a/htdocs/includes/raven-js/docs/tips/index.rst +++ /dev/null @@ -1,79 +0,0 @@ -Pro Tips™ -========= - - -Decluttering Sentry -~~~~~~~~~~~~~~~~~~~ - -The first thing to do is to consider constructing a whitelist of domains in which might raise acceptable exceptions. - -If your scripts are loaded from ``cdn.example.com`` and your site is ``example.com`` it'd be reasonable to set ``whitelistUrls`` to: - -.. code-block:: javascript - - whitelistUrls: [ - /https?:\/\/((cdn|www)\.)?example\.com/ - ] - -Since this accepts a regular expression, that would catch anything \*.example.com or example.com exactly. See also: :ref:`Config: whitelistUrls`. - -Next, checkout the list of :doc:`plugins ` we provide and see which are applicable to you. - -The community has compiled a list of common ignore rules for common things, like Facebook, Chrome extensions, etc. So it's recommended to at least check these out and see if they apply to you. `Check out the original gist `_. - -.. code-block:: javascript - - var ravenOptions = { - ignoreErrors: [ - // Random plugins/extensions - 'top.GLOBALS', - // See: http://blog.errorception.com/2012/03/tale-of-unfindable-js-error. html - 'originalCreateNotification', - 'canvas.contentDocument', - 'MyApp_RemoveAllHighlights', - 'http://tt.epicplay.com', - 'Can\'t find variable: ZiteReader', - 'jigsaw is not defined', - 'ComboSearch is not defined', - 'http://loading.retry.widdit.com/', - 'atomicFindClose', - // Facebook borked - 'fb_xd_fragment', - // ISP "optimizing" proxy - `Cache-Control: no-transform` seems to reduce this. (thanks @acdha) - // See http://stackoverflow.com/questions/4113268/how-to-stop-javascript-injection-from-vodafone-proxy - 'bmi_SafeAddOnload', - 'EBCallBackMessageReceived', - // See http://toolbar.conduit.com/Developer/HtmlAndGadget/Methods/JSInjection.aspx - 'conduitPage' - ], - ignoreUrls: [ - // Facebook flakiness - /graph\.facebook\.com/i, - // Facebook blocked - /connect\.facebook\.net\/en_US\/all\.js/i, - // Woopra flakiness - /eatdifferent\.com\.woopra-ns\.com/i, - /static\.woopra\.com\/js\/woopra\.js/i, - // Chrome extensions - /extensions\//i, - /^chrome:\/\//i, - // Other plugins - /127\.0\.0\.1:4001\/isrunning/i, // Cacaoweb - /webappstoolbarba\.texthelp\.com\//i, - /metrics\.itunes\.apple\.com\.edgesuite\.net\//i - ] - }; - - -Sampling Data -~~~~~~~~~~~~~ - -It happens frequently that errors sent from your frontend can be overwhelming. One solution here is to only send a sample of the events that happen. You can do this via the ``shouldSendCallback`` setting: - -.. code-block:: javascript - - shouldSendCallback: function(data) { - // only send 10% of errors - var sampleRate = 10; - return (Math.random() * 100 <= sampleRate); - } diff --git a/htdocs/includes/raven-js/docs/usage/index.rst b/htdocs/includes/raven-js/docs/usage/index.rst deleted file mode 100644 index c8e01f9c801..00000000000 --- a/htdocs/includes/raven-js/docs/usage/index.rst +++ /dev/null @@ -1,156 +0,0 @@ -Usage -===== - -By default, Raven makes a few efforts to try its best to capture meaningful stack traces, but browsers make it pretty difficult. - -The easiest solution is to prevent an error from bubbling all of the way up the stack to ``window``. - -How to actually capture an error correctly -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -try...catch ------------ - -The simplest way, is to try and explicitly capture and report potentially problematic code with a ``try...catch`` block and ``Raven.captureException``. - -.. code-block:: javascript - - try { - doSomething(a[0]) - } catch(e) { - Raven.captureException(e) - } - -**Do not** throw strings! Always throw an actual ``Error`` object. For example: - -.. code-block:: javascript - - throw new Error('broken') // good - throw 'broken' // bad - -It's impossible to retrieve a stack trace from a string. If this happens, Raven transmits the error as a plain message. - -context/wrap ------------- - -``Raven.context`` allows you to wrap any function to be immediately executed. Behind the scenes, Raven is just wrapping your code in a ``try...catch`` block to record the exception before re-throwing it. - -.. code-block:: javascript - - Raven.context(function() { - doSomething(a[0]) - }) - -``Raven.wrap`` wraps a function in a similar way to ``Raven.context``, but instead of executing the function, it returns another function. This is totally awesome for use when passing around a callback. - -.. code-block:: javascript - - var doIt = function() { - // doing cool stuff - } - - setTimeout(Raven.wrap(doIt), 1000) - -Tracking authenticated users -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -While a user is logged in, you can tell Sentry to associate errors with user data. - -.. code-block:: javascript - - Raven.setUserContext({ - email: 'matt@example.com', - id: '123' - }) - -If at any point, the user becomes unauthenticated, you can call ``Raven.setUserContext()`` with no arguments to remove their data. *This would only really be useful in a large web app where the user logs in/out without a page reload.* - -Capturing a specific message -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: javascript - - Raven.captureMessage('Broken!') - -Passing additional data -~~~~~~~~~~~~~~~~~~~~~~~ - -``captureException``, ``context``, ``wrap``, and ``captureMessage`` functions all allow passing additional data to be tagged onto the error, such as ``tags`` or ``extra`` for additional context. - -.. code-block:: javascript - - Raven.captureException(e, {tags: { key: "value" }}) - - Raven.captureMessage('Broken!', {tags: { key: "value" }}) - - Raven.context({tags: { key: "value" }}, function(){ ... }) - - Raven.wrap({logger: "my.module"}, function(){ ... }) - - Raven.captureException(e, {extra: { foo: "bar" }}) - -You can also set context variables globally to be merged in with future exceptions with ``setExtraContext`` and ``setTagsContext``. - -.. code-block:: javascript - - Raven.setExtraContext({ foo: "bar" }) - Raven.setTagsContext({ key: "value" }) - - -Getting back an event id -~~~~~~~~~~~~~~~~~~~~~~~~ - -An event id is a globally unique id for the event that was just sent. This event id can be used to find the exact event from within Sentry. - -This is often used to display for the user and report an error to customer service. - -.. code-block:: javascript - - Raven.lastEventId() - -``Raven.lastEventId()`` will be undefined until an event is sent. After an event is sent, it will contain the string id. - -.. code-block:: javascript - - Raven.captureMessage('Broken!') - alert(Raven.lastEventId()) - - -Check if Raven is setup and ready to go -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: javascript - - Raven.isSetup() - - -Dealing with minified source code -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Raven and Sentry now support `Source Maps `_. - -We have provided some instructions to creating Source Maps over at https://www.getsentry.com/docs/sourcemaps/. Also, checkout our `Gruntfile `_ for a good example of what we're doing. - -You can use `Source Map Validator `_ to help verify that things are correct. - -CORS -~~~~ - -If you're hosting your scripts on another domain and things don't get caught by Raven, it's likely that the error will bubble up to ``window.onerror``. If this happens, the error will report some ugly ``Script error`` and Raven will drop it on the floor -since this is a useless error for everybody. - -To help mitigate this, we can tell the browser that these scripts are safe and we're allowing them to expose their errors to us. - -In your `` - -And set an ``Access-Control-Allow-Origin`` HTTP header on that file. - -.. code-block:: console - - Access-Control-Allow-Origin: * - -**Note: both of these steps need to be done or your scripts might not even get executed** diff --git a/htdocs/includes/raven-js/example/Makefile b/htdocs/includes/raven-js/example/Makefile deleted file mode 100644 index 87976776e90..00000000000 --- a/htdocs/includes/raven-js/example/Makefile +++ /dev/null @@ -1,3 +0,0 @@ - -build: - ../node_modules/.bin/uglifyjs --source-map=file.sourcemap.js -c -o file.min.js file1.js file2.js diff --git a/htdocs/includes/raven-js/example/file.min.js b/htdocs/includes/raven-js/example/file.min.js deleted file mode 100644 index 12b9f811b28..00000000000 --- a/htdocs/includes/raven-js/example/file.min.js +++ /dev/null @@ -1,2 +0,0 @@ -function add(a,b){"use strict";return a+b}function multiply(a,b){"use strict";return a*b}function divide(a,b){"use strict";try{return multiply(add(a,b),a,b)/c}catch(e){Raven.captureException(e)}} -//@ sourceMappingURL=file.sourcemap.js \ No newline at end of file diff --git a/htdocs/includes/raven-js/example/file.sourcemap.js b/htdocs/includes/raven-js/example/file.sourcemap.js deleted file mode 100644 index 1bd0f6510cf..00000000000 --- a/htdocs/includes/raven-js/example/file.sourcemap.js +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"file.min.js","sources":["file1.js","file2.js"],"names":["add","a","b","multiply","divide","c","e","Raven","captureException"],"mappings":"AAAA,QAASA,KAAIC,EAAGC,GACf,YACA,OAAOD,GAAIC,ECFZ,QAASC,UAASF,EAAGC,GACpB,YACA,OAAOD,GAAIC,EAEZ,QAASE,QAAOH,EAAGC,GAClB,YACA,KACC,MAAOC,UAASH,IAAIC,EAAGC,GAAID,EAAGC,GAAKG,EAClC,MAAOC,GACRC,MAAMC,iBAAiBF"} \ No newline at end of file diff --git a/htdocs/includes/raven-js/example/file1.js b/htdocs/includes/raven-js/example/file1.js deleted file mode 100644 index eed5827852d..00000000000 --- a/htdocs/includes/raven-js/example/file1.js +++ /dev/null @@ -1,4 +0,0 @@ -function add(a, b) { - "use strict"; - return a + b; -} \ No newline at end of file diff --git a/htdocs/includes/raven-js/example/file2.js b/htdocs/includes/raven-js/example/file2.js deleted file mode 100644 index 8b174356846..00000000000 --- a/htdocs/includes/raven-js/example/file2.js +++ /dev/null @@ -1,12 +0,0 @@ -function multiply(a, b) { - "use strict"; - return a * b; -} -function divide(a, b) { - "use strict"; - try { - return multiply(add(a, b), a, b) / c; - } catch (e) { - Raven.captureException(e); - } -} diff --git a/htdocs/includes/raven-js/example/index.html b/htdocs/includes/raven-js/example/index.html deleted file mode 100644 index b7ebbdd018e..00000000000 --- a/htdocs/includes/raven-js/example/index.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - Scratch Disk - - - - - - - - - - - - - - - - - - diff --git a/htdocs/includes/raven-js/example/scratch.js b/htdocs/includes/raven-js/example/scratch.js deleted file mode 100644 index f1962bbdfc1..00000000000 --- a/htdocs/includes/raven-js/example/scratch.js +++ /dev/null @@ -1,42 +0,0 @@ -function foo() { - console.log("lol, i don't do anything") -} - -function foo2() { - foo() - console.log('i called foo') -} - -function broken() { - try { - /*fkjdsahfdhskfhdsahfudshafuoidashfudsa*/ fdasfds[0]; // i throw an error h sadhf hadsfdsakf kl;dsjaklf jdklsajfk ljds;klafldsl fkhdas;hf hdsaf hdsalfhjldksahfljkdsahfjkl dhsajkfl hdklsahflkjdsahkfj hdsjakhf dkashfl diusafh kdsjahfkldsahf jkdashfj khdasjkfhdjksahflkjdhsakfhjdksahfjkdhsakf hdajskhf kjdash kjfads fjkadsh jkfdsa jkfdas jkfdjkas hfjkdsajlk fdsajk fjkdsa fjdsa fdkjlsa fjkdaslk hfjlkdsah fhdsahfui - }catch(e) { - Raven.captureException(e); - } -} - -function ready() { - document.getElementById('test').onclick = broken; -} - -function foo3() { - document.getElementById('crap').value = 'barfdasjkfhoadshflkaosfjadiosfhdaskjfasfadsfads'; -} - -function somethingelse() { - document.getElementById('somethingelse').value = 'this is some realy really long message just so our minification is largeeeeeeeeee!'; -} - -function derp() { - fdas[0]; -} - -function testOptions() { - Raven.context({tags: {foo: 'bar'}}, function() { - throw new Error('foo'); - }); -} - -function throwString() { - throw 'oops'; -} diff --git a/htdocs/includes/raven-js/package.json b/htdocs/includes/raven-js/package.json deleted file mode 100644 index 9352edcab38..00000000000 --- a/htdocs/includes/raven-js/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "raven-js", - "version": "1.1.19", - "license": "BSD-2-Clause", - "homepage": "https://getsentry.com", - "scripts": { - "pretest": "npm install", - "test": "grunt test" - }, - "repository": { - "type": "git", - "url": "git://github.com/getsentry/raven-js.git" - }, - "main": "dist/raven.js", - "devDependencies": { - "chai": "~1.8.1", - "grunt": "~0.4.1", - "grunt-cli": "~0.1.9", - "grunt-contrib-jshint": "~0.6.3", - "grunt-contrib-uglify": "~0.2.2", - "grunt-contrib-concat": "~0.3.0", - "grunt-contrib-clean": "~0.4.0", - "grunt-mocha": "~0.4.1", - "grunt-release": "~0.6.0", - "grunt-s3": "~0.2.0-alpha.3", - "grunt-gitinfo": "~0.1.1", - "grunt-contrib-connect": "~0.5.0", - "grunt-contrib-copy": "~0.4.1", - "sinon": "~1.7.3", - "lodash": "~2.4.0" - } -} diff --git a/htdocs/includes/raven-js/plugins/angular.js b/htdocs/includes/raven-js/plugins/angular.js deleted file mode 100644 index 98bf5892001..00000000000 --- a/htdocs/includes/raven-js/plugins/angular.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Angular.js plugin - * - * Provides an $exceptionHandler for Angular.js - */ -;(function(Raven, angular) { -'use strict'; - -// quit if angular isn't on the page -if (!angular) { - return; -} - -function ngRavenProvider($provide) { - $provide.decorator('$exceptionHandler', [ - 'RavenConfig', '$delegate', - ngRavenExceptionHandler - ]); -} - -function ngRavenExceptionHandler(RavenConfig, $delegate) { - if (!RavenConfig) - throw new Error('RavenConfig must be set before using this'); - - Raven.config(RavenConfig.dsn, RavenConfig.config).install(); - return function angularExceptionHandler(ex, cause) { - $delegate(ex, cause); - Raven.captureException(ex, {extra: {cause: cause}}); - }; -} - -angular.module('ngRaven', []) - .config(['$provide', ngRavenProvider]) - .value('Raven', Raven); - -})(window.Raven, window.angular); diff --git a/htdocs/includes/raven-js/plugins/backbone.js b/htdocs/includes/raven-js/plugins/backbone.js deleted file mode 100644 index 09e0f6b8c1c..00000000000 --- a/htdocs/includes/raven-js/plugins/backbone.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Backbone.js plugin - * - * Patches Backbone.Events callbacks. - */ -;(function(window, Raven, Backbone) { -'use strict'; - -// quit if Backbone isn't on the page -if (!Backbone) { - return; -} - -function makeBackboneEventsOn(oldOn) { - return function BackboneEventsOn(name, callback, context) { - var wrapCallback = function (cb) { - if (Object.prototype.toString.call(cb) === '[object Function]') { - var _callback = cb._callback || cb; - cb = Raven.wrap(cb); - cb._callback = _callback; - } - return cb; - }; - if (Object.prototype.toString.call(name) === '[object Object]') { - // Handle event maps. - for (var key in name) { - if (name.hasOwnProperty(key)) { - name[key] = wrapCallback(name[key]); - } - } - } else { - callback = wrapCallback(callback); - } - return oldOn.call(this, name, callback, context); - }; -} - -// We're too late to catch all of these by simply patching Backbone.Events.on -var affectedObjects = [ - Backbone.Events, - Backbone, - Backbone.Model.prototype, - Backbone.Collection.prototype, - Backbone.View.prototype, - Backbone.Router.prototype, - Backbone.History.prototype -], i = 0, l = affectedObjects.length; - -for (; i < l; i++) { - var affected = affectedObjects[i]; - affected.on = makeBackboneEventsOn(affected.on); - affected.bind = affected.on; -} - -}(window, window.Raven, window.Backbone)); diff --git a/htdocs/includes/raven-js/plugins/console.js b/htdocs/includes/raven-js/plugins/console.js deleted file mode 100644 index 4d5ba94090f..00000000000 --- a/htdocs/includes/raven-js/plugins/console.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * console plugin - * - * Monkey patches console.* calls into Sentry messages with - * their appropriate log levels. (Experimental) - */ -;(function(window, Raven, console) { -'use strict'; - -var originalConsole = console, - logLevels = ['debug', 'info', 'warn', 'error'], - level = logLevels.pop(); - -var logForGivenLevel = function(level) { - var originalConsoleLevel = console[level]; - - // warning level is the only level that doesn't map up - // correctly with what Sentry expects. - if (level === 'warn') level = 'warning'; - return function () { - var args = [].slice.call(arguments); - Raven.captureMessage('' + args, {level: level, logger: 'console'}); - - // this fails for some browsers. :( - if (originalConsoleLevel) { - // IE9 doesn't allow calling apply on console functions directly - // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193 - Function.prototype.bind - .call(originalConsoleLevel, originalConsole) - .apply(originalConsole, args); - } - }; -}; - - -while(level) { - console[level] = logForGivenLevel(level); - level = logLevels.pop(); -} -// export -window.console = console; - -}(window, window.Raven, window.console || {})); diff --git a/htdocs/includes/raven-js/plugins/ember.js b/htdocs/includes/raven-js/plugins/ember.js deleted file mode 100644 index c6d0551c709..00000000000 --- a/htdocs/includes/raven-js/plugins/ember.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Ember.js plugin - * - * Patches event handler callbacks and ajax callbacks. - */ -;(function(window, Raven, Ember) { -'use strict'; - -// quit if Ember isn't on the page -if (!Ember) { - return; -} - -var _oldOnError = Ember.onerror; -Ember.onerror = function EmberOnError(error) { - Raven.captureException(error); - if (typeof _oldOnError === 'function') { - _oldOnError.call(this, error); - } -}; -Ember.RSVP.on('error', function (reason) { - if (reason instanceof Error) { - Raven.captureException(reason, {extra: {context: 'Unhandled Promise error detected'}}); - } else { - Raven.captureMessage('Unhandled Promise error detected', {extra: {reason: reason}}); - } -}); - -}(window, window.Raven, window.Ember)); diff --git a/htdocs/includes/raven-js/plugins/jquery.js b/htdocs/includes/raven-js/plugins/jquery.js deleted file mode 100644 index 4a5474cdb86..00000000000 --- a/htdocs/includes/raven-js/plugins/jquery.js +++ /dev/null @@ -1,75 +0,0 @@ -/** - * jQuery plugin - * - * Patches event handler callbacks and ajax callbacks. - */ -;(function(window, Raven, $) { -'use strict'; - -// quit if jQuery isn't on the page -if (!$) { - return; -} - -var _oldEventAdd = $.event.add; -$.event.add = function ravenEventAdd(elem, types, handler, data, selector) { - var _handler; - - if (handler && handler.handler) { - _handler = handler.handler; - handler.handler = Raven.wrap(handler.handler); - } else { - _handler = handler; - handler = Raven.wrap(handler); - } - - // If the handler we are attaching doesn’t have the same guid as - // the original, it will never be removed when someone tries to - // unbind the original function later. Technically as a result of - // this our guids are no longer globally unique, but whatever, that - // never hurt anybody RIGHT?! - if (_handler.guid) { - handler.guid = _handler.guid; - } else { - handler.guid = _handler.guid = $.guid++; - } - - return _oldEventAdd.call(this, elem, types, handler, data, selector); -}; - -var _oldReady = $.fn.ready; -$.fn.ready = function ravenjQueryReadyWrapper(fn) { - return _oldReady.call(this, Raven.wrap(fn)); -}; - -var _oldAjax = $.ajax; -$.ajax = function ravenAjaxWrapper(url, options) { - var keys = ['complete', 'error', 'success'], key; - - // Taken from https://github.com/jquery/jquery/blob/eee2eaf1d7a189d99106423a4206c224ebd5b848/src/ajax.js#L311-L318 - // If url is an object, simulate pre-1.5 signature - if (typeof url === 'object') { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - /*jshint -W084*/ - while(key = keys.pop()) { - if ($.isFunction(options[key])) { - options[key] = Raven.wrap(options[key]); - } - } - /*jshint +W084*/ - - try { - return _oldAjax.call(this, url, options); - } catch (e) { - Raven.captureException(e); - throw e; - } -}; - -}(window, window.Raven, window.jQuery)); diff --git a/htdocs/includes/raven-js/plugins/native.js b/htdocs/includes/raven-js/plugins/native.js deleted file mode 100644 index c641f13a5d1..00000000000 --- a/htdocs/includes/raven-js/plugins/native.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * native plugin - * - * Extends support for global error handling for asynchronous browser - * functions. Adopted from Closure Library's errorhandler.js. - */ -;(function extendToAsynchronousCallbacks(window, Raven) { -"use strict"; - -var _helper = function _helper(fnName) { - var originalFn = window[fnName]; - window[fnName] = function ravenAsyncExtension() { - // Make a copy of the arguments - var args = [].slice.call(arguments); - var originalCallback = args[0]; - if (typeof (originalCallback) === 'function') { - args[0] = Raven.wrap(originalCallback); - } - // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it - // also supports only two arguments and doesn't care what this is, so we - // can just call the original function directly. - if (originalFn.apply) { - return originalFn.apply(this, args); - } else { - return originalFn(args[0], args[1]); - } - }; -}; - -_helper('setTimeout'); -_helper('setInterval'); - -}(window, window.Raven)); diff --git a/htdocs/includes/raven-js/plugins/require.js b/htdocs/includes/raven-js/plugins/require.js deleted file mode 100644 index 60378a1b0b9..00000000000 --- a/htdocs/includes/raven-js/plugins/require.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * require.js plugin - * - * Automatically wrap define/require callbacks. (Experimental) - */ -;(function(window, Raven) { -'use strict'; - -if (typeof define === 'function' && define.amd) { - window.define = Raven.wrap({deep: false}, define); - window.require = Raven.wrap({deep: false}, require); -} - -}(window, window.Raven)); diff --git a/htdocs/includes/raven-js/src/raven.js b/htdocs/includes/raven-js/src/raven.js deleted file mode 100644 index a2d2b35604b..00000000000 --- a/htdocs/includes/raven-js/src/raven.js +++ /dev/null @@ -1,830 +0,0 @@ -'use strict'; - -// First, check for JSON support -// If there is no JSON, we no-op the core features of Raven -// since JSON is required to encode the payload -var _Raven = window.Raven, - hasJSON = !!(typeof JSON === 'object' && JSON.stringify), - lastCapturedException, - lastEventId, - globalServer, - globalUser, - globalKey, - globalProject, - globalOptions = { - logger: 'javascript', - ignoreErrors: [], - ignoreUrls: [], - whitelistUrls: [], - includePaths: [], - collectWindowErrors: true, - tags: {}, - maxMessageLength: 100, - extra: {} - }, - authQueryString, - isRavenInstalled = false, - - objectPrototype = Object.prototype, - startTime = now(); - -/* - * The core Raven singleton - * - * @this {Raven} - */ -var Raven = { - VERSION: '<%= pkg.version %>', - - debug: true, - - /* - * Allow multiple versions of Raven to be installed. - * Strip Raven from the global context and returns the instance. - * - * @return {Raven} - */ - noConflict: function() { - window.Raven = _Raven; - return Raven; - }, - - /* - * Configure Raven with a DSN and extra options - * - * @param {string} dsn The public Sentry DSN - * @param {object} options Optional set of of global options [optional] - * @return {Raven} - */ - config: function(dsn, options) { - if (globalServer) { - logDebug('error', 'Error: Raven has already been configured'); - return Raven; - } - if (!dsn) return Raven; - - var uri = parseDSN(dsn), - lastSlash = uri.path.lastIndexOf('/'), - path = uri.path.substr(1, lastSlash); - - // merge in options - if (options) { - each(options, function(key, value){ - globalOptions[key] = value; - }); - } - - // "Script error." is hard coded into browsers for errors that it can't read. - // this is the result of a script being pulled in from an external domain and CORS. - globalOptions.ignoreErrors.push(/^Script error\.?$/); - globalOptions.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/); - - // join regexp rules into one big rule - globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors); - globalOptions.ignoreUrls = globalOptions.ignoreUrls.length ? joinRegExp(globalOptions.ignoreUrls) : false; - globalOptions.whitelistUrls = globalOptions.whitelistUrls.length ? joinRegExp(globalOptions.whitelistUrls) : false; - globalOptions.includePaths = joinRegExp(globalOptions.includePaths); - - globalKey = uri.user; - globalProject = uri.path.substr(lastSlash + 1); - - // assemble the endpoint from the uri pieces - globalServer = '//' + uri.host + - (uri.port ? ':' + uri.port : '') + - '/' + path + 'api/' + globalProject + '/store/'; - - if (uri.protocol) { - globalServer = uri.protocol + ':' + globalServer; - } - - if (globalOptions.fetchContext) { - TraceKit.remoteFetching = true; - } - - if (globalOptions.linesOfContext) { - TraceKit.linesOfContext = globalOptions.linesOfContext; - } - - TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors; - - setAuthQueryString(); - - // return for chaining - return Raven; - }, - - /* - * Installs a global window.onerror error handler - * to capture and report uncaught exceptions. - * At this point, install() is required to be called due - * to the way TraceKit is set up. - * - * @return {Raven} - */ - install: function() { - if (isSetup() && !isRavenInstalled) { - TraceKit.report.subscribe(handleStackInfo); - isRavenInstalled = true; - } - - return Raven; - }, - - /* - * Wrap code within a context so Raven can capture errors - * reliably across domains that is executed immediately. - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The callback to be immediately executed within the context - * @param {array} args An array of arguments to be called with the callback [optional] - */ - context: function(options, func, args) { - if (isFunction(options)) { - args = func || []; - func = options; - options = undefined; - } - - return Raven.wrap(options, func).apply(this, args); - }, - - /* - * Wrap code within a context and returns back a new function to be executed - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The function to be wrapped in a new context - * @return {function} The newly wrapped functions with a context - */ - wrap: function(options, func) { - // 1 argument has been passed, and it's not a function - // so just return it - if (isUndefined(func) && !isFunction(options)) { - return options; - } - - // options is optional - if (isFunction(options)) { - func = options; - options = undefined; - } - - // At this point, we've passed along 2 arguments, and the second one - // is not a function either, so we'll just return the second argument. - if (!isFunction(func)) { - return func; - } - - // We don't wanna wrap it twice! - if (func.__raven__) { - return func; - } - - function wrapped() { - var args = [], i = arguments.length, - deep = !options || options && options.deep !== false; - // Recursively wrap all of a function's arguments that are - // functions themselves. - - while(i--) args[i] = deep ? Raven.wrap(options, arguments[i]) : arguments[i]; - - try { - /*jshint -W040*/ - return func.apply(this, args); - } catch(e) { - Raven.captureException(e, options); - throw e; - } - } - - // copy over properties of the old function - for (var property in func) { - if (hasKey(func, property)) { - wrapped[property] = func[property]; - } - } - - // Signal that this function has been wrapped already - // for both debugging and to prevent it to being wrapped twice - wrapped.__raven__ = true; - wrapped.__inner__ = func; - - return wrapped; - }, - - /* - * Uninstalls the global error handler. - * - * @return {Raven} - */ - uninstall: function() { - TraceKit.report.uninstall(); - isRavenInstalled = false; - - return Raven; - }, - - /* - * Manually capture an exception and send it over to Sentry - * - * @param {error} ex An exception to be logged - * @param {object} options A specific set of options for this error [optional] - * @return {Raven} - */ - captureException: function(ex, options) { - // If not an Error is passed through, recall as a message instead - if (!isError(ex)) return Raven.captureMessage(ex, options); - - // Store the raw exception object for potential debugging and introspection - lastCapturedException = ex; - - // TraceKit.report will re-raise any exception passed to it, - // which means you have to wrap it in try/catch. Instead, we - // can wrap it here and only re-raise if TraceKit.report - // raises an exception different from the one we asked to - // report on. - try { - TraceKit.report(ex, options); - } catch(ex1) { - if(ex !== ex1) { - throw ex1; - } - } - - return Raven; - }, - - /* - * Manually send a message to Sentry - * - * @param {string} msg A plain message to be captured in Sentry - * @param {object} options A specific set of options for this message [optional] - * @return {Raven} - */ - captureMessage: function(msg, options) { - // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an - // early call; we'll error on the side of logging anything called before configuration since it's - // probably something you should see: - if (!!globalOptions.ignoreErrors.test && globalOptions.ignoreErrors.test(msg)) { - return; - } - - // Fire away! - send( - objectMerge({ - message: msg + '' // Make sure it's actually a string - }, options) - ); - - return Raven; - }, - - /* - * Set/clear a user to be sent along with the payload. - * - * @param {object} user An object representing user data [optional] - * @return {Raven} - */ - setUserContext: function(user) { - globalUser = user; - - return Raven; - }, - - /* - * Set extra attributes to be sent along with the payload. - * - * @param {object} extra An object representing extra data [optional] - * @return {Raven} - */ - setExtraContext: function(extra) { - globalOptions.extra = extra || {}; - - return Raven; - }, - - /* - * Set tags to be sent along with the payload. - * - * @param {object} tags An object representing tags [optional] - * @return {Raven} - */ - setTagsContext: function(tags) { - globalOptions.tags = tags || {}; - - return Raven; - }, - - /* - * Set release version of application - * - * @param {string} release Typically something like a git SHA to identify version - * @return {Raven} - */ - setReleaseContext: function(release) { - globalOptions.release = release; - - return Raven; - }, - - /* - * Set the dataCallback option - * - * @param {function} callback The callback to run which allows the - * data blob to be mutated before sending - * @return {Raven} - */ - setDataCallback: function(callback) { - globalOptions.dataCallback = callback; - - return Raven; - }, - - /* - * Set the shouldSendCallback option - * - * @param {function} callback The callback to run which allows - * introspecting the blob before sending - * @return {Raven} - */ - setShouldSendCallback: function(callback) { - globalOptions.shouldSendCallback = callback; - - return Raven; - }, - - /* - * Get the latest raw exception that was captured by Raven. - * - * @return {error} - */ - lastException: function() { - return lastCapturedException; - }, - - /* - * Get the last event id - * - * @return {string} - */ - lastEventId: function() { - return lastEventId; - }, - - /* - * Determine if Raven is setup and ready to go. - * - * @return {boolean} - */ - isSetup: function() { - return isSetup(); - } -}; - -Raven.setUser = Raven.setUserContext; // To be deprecated - -function triggerEvent(eventType, options) { - var event, key; - - options = options || {}; - - eventType = 'raven' + eventType.substr(0,1).toUpperCase() + eventType.substr(1); - - if (document.createEvent) { - event = document.createEvent('HTMLEvents'); - event.initEvent(eventType, true, true); - } else { - event = document.createEventObject(); - event.eventType = eventType; - } - - for (key in options) if (hasKey(options, key)) { - event[key] = options[key]; - } - - if (document.createEvent) { - // IE9 if standards - document.dispatchEvent(event); - } else { - // IE8 regardless of Quirks or Standards - // IE9 if quirks - try { - document.fireEvent('on' + event.eventType.toLowerCase(), event); - } catch(e) {} - } -} - -var dsnKeys = 'source protocol user pass host port path'.split(' '), - dsnPattern = /^(?:(\w+):)?\/\/(\w+)(:\w+)?@([\w\.-]+)(?::(\d+))?(\/.*)/; - -function RavenConfigError(message) { - this.name = 'RavenConfigError'; - this.message = message; -} -RavenConfigError.prototype = new Error(); -RavenConfigError.prototype.constructor = RavenConfigError; - -/**** Private functions ****/ -function parseDSN(str) { - var m = dsnPattern.exec(str), - dsn = {}, - i = 7; - - try { - while (i--) dsn[dsnKeys[i]] = m[i] || ''; - } catch(e) { - throw new RavenConfigError('Invalid DSN: ' + str); - } - - if (dsn.pass) - throw new RavenConfigError('Do not specify your private key in the DSN!'); - - return dsn; -} - -function isUndefined(what) { - return what === void 0; -} - -function isFunction(what) { - return typeof what === 'function'; -} - -function isString(what) { - return objectPrototype.toString.call(what) === '[object String]'; -} - -function isObject(what) { - return typeof what === 'object' && what !== null; -} - -function isEmptyObject(what) { - for (var k in what) return false; - return true; -} - -// Sorta yanked from https://github.com/joyent/node/blob/aa3b4b4/lib/util.js#L560 -// with some tiny modifications -function isError(what) { - return isObject(what) && - objectPrototype.toString.call(what) === '[object Error]' || - what instanceof Error; -} - -/** - * hasKey, a better form of hasOwnProperty - * Example: hasKey(MainHostObject, property) === true/false - * - * @param {Object} host object to check property - * @param {string} key to check - */ -function hasKey(object, key) { - return objectPrototype.hasOwnProperty.call(object, key); -} - -function each(obj, callback) { - var i, j; - - if (isUndefined(obj.length)) { - for (i in obj) { - if (hasKey(obj, i)) { - callback.call(null, i, obj[i]); - } - } - } else { - j = obj.length; - if (j) { - for (i = 0; i < j; i++) { - callback.call(null, i, obj[i]); - } - } - } -} - - -function setAuthQueryString() { - authQueryString = - '?sentry_version=4' + - '&sentry_client=raven-js/' + Raven.VERSION + - '&sentry_key=' + globalKey; -} - - -function handleStackInfo(stackInfo, options) { - var frames = []; - - if (stackInfo.stack && stackInfo.stack.length) { - each(stackInfo.stack, function(i, stack) { - var frame = normalizeFrame(stack); - if (frame) { - frames.push(frame); - } - }); - } - - triggerEvent('handle', { - stackInfo: stackInfo, - options: options - }); - - processException( - stackInfo.name, - stackInfo.message, - stackInfo.url, - stackInfo.lineno, - frames, - options - ); -} - -function normalizeFrame(frame) { - if (!frame.url) return; - - // normalize the frames data - var normalized = { - filename: frame.url, - lineno: frame.line, - colno: frame.column, - 'function': frame.func || '?' - }, context = extractContextFromFrame(frame), i; - - if (context) { - var keys = ['pre_context', 'context_line', 'post_context']; - i = 3; - while (i--) normalized[keys[i]] = context[i]; - } - - normalized.in_app = !( // determine if an exception came from outside of our app - // first we check the global includePaths list. - !globalOptions.includePaths.test(normalized.filename) || - // Now we check for fun, if the function name is Raven or TraceKit - /(Raven|TraceKit)\./.test(normalized['function']) || - // finally, we do a last ditch effort and check for raven.min.js - /raven\.(min\.)?js$/.test(normalized.filename) - ); - - return normalized; -} - -function extractContextFromFrame(frame) { - // immediately check if we should even attempt to parse a context - if (!frame.context || !globalOptions.fetchContext) return; - - var context = frame.context, - pivot = ~~(context.length / 2), - i = context.length, isMinified = false; - - while (i--) { - // We're making a guess to see if the source is minified or not. - // To do that, we make the assumption if *any* of the lines passed - // in are greater than 300 characters long, we bail. - // Sentry will see that there isn't a context - if (context[i].length > 300) { - isMinified = true; - break; - } - } - - if (isMinified) { - // The source is minified and we don't know which column. Fuck it. - if (isUndefined(frame.column)) return; - - // If the source is minified and has a frame column - // we take a chunk of the offending line to hopefully shed some light - return [ - [], // no pre_context - context[pivot].substr(frame.column, 50), // grab 50 characters, starting at the offending column - [] // no post_context - ]; - } - - return [ - context.slice(0, pivot), // pre_context - context[pivot], // context_line - context.slice(pivot + 1) // post_context - ]; -} - -function processException(type, message, fileurl, lineno, frames, options) { - var stacktrace, label, i; - - // In some instances message is not actually a string, no idea why, - // so we want to always coerce it to one. - message += ''; - - // Sometimes an exception is getting logged in Sentry as - // - // This can only mean that the message was falsey since this value - // is hardcoded into Sentry itself. - // At this point, if the message is falsey, we bail since it's useless - if (type === 'Error' && !message) return; - - if (globalOptions.ignoreErrors.test(message)) return; - - if (frames && frames.length) { - fileurl = frames[0].filename || fileurl; - // Sentry expects frames oldest to newest - // and JS sends them as newest to oldest - frames.reverse(); - stacktrace = {frames: frames}; - } else if (fileurl) { - stacktrace = { - frames: [{ - filename: fileurl, - lineno: lineno, - in_app: true - }] - }; - } - - // Truncate the message to a max of characters - message = truncate(message, globalOptions.maxMessageLength); - - if (globalOptions.ignoreUrls && globalOptions.ignoreUrls.test(fileurl)) return; - if (globalOptions.whitelistUrls && !globalOptions.whitelistUrls.test(fileurl)) return; - - label = lineno ? message + ' at ' + lineno : message; - - // Fire away! - send( - objectMerge({ - // sentry.interfaces.Exception - exception: { - type: type, - value: message - }, - // sentry.interfaces.Stacktrace - stacktrace: stacktrace, - culprit: fileurl, - message: label - }, options) - ); -} - -function objectMerge(obj1, obj2) { - if (!obj2) { - return obj1; - } - each(obj2, function(key, value){ - obj1[key] = value; - }); - return obj1; -} - -function truncate(str, max) { - return str.length <= max ? str : str.substr(0, max) + '\u2026'; -} - -function now() { - return +new Date(); -} - -function getHttpData() { - var http = { - url: document.location.href, - headers: { - 'User-Agent': navigator.userAgent - } - }; - - if (document.referrer) { - http.headers.Referer = document.referrer; - } - - return http; -} - -function send(data) { - if (!isSetup()) return; - - data = objectMerge({ - project: globalProject, - logger: globalOptions.logger, - platform: 'javascript', - // sentry.interfaces.Http - request: getHttpData() - }, data); - - // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge - data.tags = objectMerge(objectMerge({}, globalOptions.tags), data.tags); - data.extra = objectMerge(objectMerge({}, globalOptions.extra), data.extra); - - // Send along our own collected metadata with extra - data.extra = objectMerge({ - 'session:duration': now() - startTime - }, data.extra); - - // If there are no tags/extra, strip the key from the payload alltogther. - if (isEmptyObject(data.tags)) delete data.tags; - - if (globalUser) { - // sentry.interfaces.User - data.user = globalUser; - } - - // Include the release iff it's defined in globalOptions - if (globalOptions.release) data.release = globalOptions.release; - - if (isFunction(globalOptions.dataCallback)) { - data = globalOptions.dataCallback(data) || data; - } - - // Why?????????? - if (!data || isEmptyObject(data)) { - return; - } - - // Check if the request should be filtered or not - if (isFunction(globalOptions.shouldSendCallback) && !globalOptions.shouldSendCallback(data)) { - return; - } - - // Send along an event_id if not explicitly passed. - // This event_id can be used to reference the error within Sentry itself. - // Set lastEventId after we know the error should actually be sent - lastEventId = data.event_id || (data.event_id = uuid4()); - - makeRequest(data); -} - - -function makeRequest(data) { - var img = newImage(), - src = globalServer + authQueryString + '&sentry_data=' + encodeURIComponent(JSON.stringify(data)); - - img.crossOrigin = 'anonymous'; - img.onload = function success() { - triggerEvent('success', { - data: data, - src: src - }); - }; - img.onerror = img.onabort = function failure() { - triggerEvent('failure', { - data: data, - src: src - }); - }; - img.src = src; -} - -// Note: this is shitty, but I can't figure out how to get -// sinon to stub document.createElement without breaking everything -// so this wrapper is just so I can stub it for tests. -function newImage() { - return document.createElement('img'); -} - -function isSetup() { - if (!hasJSON) return false; // needs JSON support - if (!globalServer) { - logDebug('error', 'Error: Raven has not been configured.'); - return false; - } - return true; -} - -function joinRegExp(patterns) { - // Combine an array of regular expressions and strings into one large regexp - // Be mad. - var sources = [], - i = 0, len = patterns.length, - pattern; - - for (; i < len; i++) { - pattern = patterns[i]; - if (isString(pattern)) { - // If it's a string, we need to escape it - // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions - sources.push(pattern.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1")); - } else if (pattern && pattern.source) { - // If it's a regexp already, we want to extract the source - sources.push(pattern.source); - } - // Intentionally skip other cases - } - return new RegExp(sources.join('|'), 'i'); -} - -// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 -function uuid4() { - return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = Math.random()*16|0, - v = c == 'x' ? r : (r&0x3|0x8); - return v.toString(16); - }); -} - -function logDebug(level, message) { - if (window.console && console[level] && Raven.debug) { - console[level](message); - } -} - -function afterLoad() { - // Attempt to initialize Raven on load - var RavenConfig = window.RavenConfig; - if (RavenConfig) { - Raven.config(RavenConfig.dsn, RavenConfig.config).install(); - } -} -afterLoad(); diff --git a/htdocs/includes/raven-js/template/_copyright.js b/htdocs/includes/raven-js/template/_copyright.js deleted file mode 100644 index f1ee87084f8..00000000000 --- a/htdocs/includes/raven-js/template/_copyright.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! Raven.js <%= pkg.release %> (<%= gitinfo.local.branch.current.shortSHA %>) | github.com/getsentry/raven-js */ - -/* - * Includes TraceKit - * https://github.com/getsentry/TraceKit - * - * Copyright <%= grunt.template.today('yyyy') %> Matt Robenolt and other contributors - * Released under the BSD license - * https://github.com/getsentry/raven-js/blob/master/LICENSE - * - */ diff --git a/htdocs/includes/raven-js/template/_footer.js b/htdocs/includes/raven-js/template/_footer.js deleted file mode 100644 index 9d102d2458d..00000000000 --- a/htdocs/includes/raven-js/template/_footer.js +++ /dev/null @@ -1,19 +0,0 @@ -// Expose Raven to the world -if (typeof define === 'function' && define.amd) { - // AMD - window.Raven = Raven; - define('raven', [], function() { - return Raven; - }); -} else if (typeof module === 'object') { - // browserify - module.exports = Raven; -} else if (typeof exports === 'object') { - // CommonJS - exports = Raven; -} else { - // Everything else - window.Raven = Raven; -} - -})(typeof window !== 'undefined' ? window : this); diff --git a/htdocs/includes/raven-js/template/_header.js b/htdocs/includes/raven-js/template/_header.js deleted file mode 100644 index 27595a61a2d..00000000000 --- a/htdocs/includes/raven-js/template/_header.js +++ /dev/null @@ -1,2 +0,0 @@ -;(function(window, undefined){ -'use strict'; diff --git a/htdocs/includes/raven-js/test/index.html b/htdocs/includes/raven-js/test/index.html deleted file mode 100644 index b5188ed0600..00000000000 --- a/htdocs/includes/raven-js/test/index.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - Raven.js Test Suite - - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/htdocs/includes/raven-js/test/raven.test.js b/htdocs/includes/raven-js/test/raven.test.js deleted file mode 100644 index e26a36ef174..00000000000 --- a/htdocs/includes/raven-js/test/raven.test.js +++ /dev/null @@ -1,1773 +0,0 @@ -function flushRavenState() { - authQueryString = undefined; - hasJSON = !isUndefined(window.JSON); - lastCapturedException = undefined; - lastEventId = undefined; - globalServer = undefined; - globalUser = undefined; - globalProject = undefined; - globalOptions = { - logger: 'javascript', - release: undefined, - ignoreErrors: [], - ignoreUrls: [], - whitelistUrls: [], - includePaths: [], - collectWindowErrors: true, - maxMessageLength: 100, - tags: {}, - extra: {} - }, - startTime = 0 - ; - - Raven.uninstall(); -} - -// window.console must be stubbed in for browsers that don't have it -if (typeof window.console === 'undefined') { - console = {error: function(){}}; -} - -var SENTRY_DSN = 'http://abc@example.com:80/2'; - -function setupRaven() { - Raven.config(SENTRY_DSN); -} - -// patched to return a predictable result -function uuid4() { - return 'abc123'; -} - -// patched to be predictable -function now() { - return 100; -} - -describe('TraceKit', function(){ - describe('stacktrace info', function() { - it('should not remove anonymous functions from the stack', function() { - // mock up an error object with a stack trace that includes both - // named functions and anonymous functions - var stack_str = "" + - " Error: \n" + - " at new (http://example.com/js/test.js:63)\n" + // stack[0] - " at namedFunc0 (http://example.com/js/script.js:10)\n" + // stack[1] - " at http://example.com/js/test.js:65\n" + // stack[2] - " at namedFunc2 (http://example.com/js/script.js:20)\n" + // stack[3] - " at http://example.com/js/test.js:67\n" + // stack[4] - " at namedFunc4 (http://example.com/js/script.js:100001)"; // stack[5] - var mock_err = { stack: stack_str }; - var trace = TraceKit.computeStackTrace.computeStackTraceFromStackProp(mock_err); - - // Make sure TraceKit didn't remove the anonymous functions - // from the stack like it used to :) - assert.equal(trace.stack[0].func, 'new '); - assert.equal(trace.stack[1].func, 'namedFunc0'); - assert.equal(trace.stack[2].func, '?'); - assert.equal(trace.stack[3].func, 'namedFunc2'); - assert.equal(trace.stack[4].func, '?'); - assert.equal(trace.stack[5].func, 'namedFunc4'); - }); - }); - describe('error notifications', function(){ - var testMessage = "__mocha_ignore__"; - var subscriptionHandler; - // TraceKit waits 2000ms for window.onerror to fire, so give the tests - // some extra time. - this.timeout(3000); - - before(function() { - // Prevent the onerror call that's part of our tests from getting to - // mocha's handler, which would treat it as a test failure. - // - // We set this up here and don't ever restore the old handler, because - // we can't do that without clobbering TraceKit's handler, which can only - // be installed once. - var oldOnError = window.onerror; - window.onerror = function(message) { - if (message == testMessage) { - return true; - } - return oldOnError.apply(this, arguments); - }; - }); - - afterEach(function() { - if (subscriptionHandler) { - TraceKit.report.unsubscribe(subscriptionHandler); - subscriptionHandler = null; - } - }); - - function testErrorNotification(collectWindowErrors, callOnError, numReports, done) { - var extraVal = "foo"; - var numDone = 0; - // TraceKit's collectWindowErrors flag shouldn't affect direct calls - // to TraceKit.report, so we parameterize it for the tests. - TraceKit.collectWindowErrors = collectWindowErrors; - - subscriptionHandler = function(stackInfo, extra) { - assert.equal(extra, extraVal); - numDone++; - if (numDone == numReports) { - done(); - } - }; - TraceKit.report.subscribe(subscriptionHandler); - - // TraceKit.report always throws an exception in order to trigger - // window.onerror so it can gather more stack data. Mocha treats - // uncaught exceptions as errors, so we catch it via assert.throws - // here (and manually call window.onerror later if appropriate). - // - // We test multiple reports because TraceKit has special logic for when - // report() is called a second time before either a timeout elapses or - // window.onerror is called (which is why we always call window.onerror - // only once below, after all calls to report()). - for (var i=0; i < numReports; i++) { - var e = new Error('testing'); - assert.throws(function() { - TraceKit.report(e, extraVal); - }, e); - } - // The call to report should work whether or not window.onerror is - // triggered, so we parameterize it for the tests. We only call it - // once, regardless of numReports, because the case we want to test for - // multiple reports is when window.onerror is *not* called between them. - if (callOnError) { - window.onerror(testMessage); - } - } - - Mocha.utils.forEach([false, true], function(collectWindowErrors) { - Mocha.utils.forEach([false, true], function(callOnError) { - Mocha.utils.forEach([1, 2], function(numReports) { - it('it should receive arguments from report() when' + - ' collectWindowErrors is ' + collectWindowErrors + - ' and callOnError is ' + callOnError + - ' and numReports is ' + numReports, function(done) { - testErrorNotification(collectWindowErrors, callOnError, numReports, done); - }); - }); - }); - }); - }); -}); - -describe('globals', function() { - beforeEach(function() { - setupRaven(); - globalOptions.fetchContext = true; - }); - - afterEach(function() { - flushRavenState(); - }); - - describe('getHttpData', function() { - var data = getHttpData(); - - it('should have a url', function() { - assert.equal(data.url, window.location.href); - }); - - it('should have the user-agent header', function() { - assert.equal(data.headers['User-Agent'], navigator.userAgent); - }); - - it('should have referer header when available', function() { - // lol this test is awful - if (window.document.referrer) { - assert.equal(data.headers.Referer, window.document.referrer); - } else { - assert.isUndefined(data.headers.Referer); - } - }); - - }); - - describe('isUndefined', function() { - it('should do as advertised', function() { - assert.isTrue(isUndefined()); - assert.isFalse(isUndefined({})); - assert.isFalse(isUndefined('')); - assert.isTrue(isUndefined(undefined)); - }); - }); - - describe('isFunction', function() { - it('should do as advertised', function() { - assert.isTrue(isFunction(function(){})); - assert.isFalse(isFunction({})); - assert.isFalse(isFunction('')); - assert.isFalse(isFunction(undefined)); - }); - }); - - describe('isString', function() { - it('should do as advertised', function() { - assert.isTrue(isString('')); - assert.isTrue(isString(String(''))); - assert.isTrue(isString(new String(''))); - assert.isFalse(isString({})); - assert.isFalse(isString(undefined)); - assert.isFalse(isString(function(){})); - }); - }); - - describe('isObject', function() { - it('should do as advertised', function() { - assert.isTrue(isObject({})); - assert.isTrue(isObject(new Error())) - assert.isFalse(isObject('')); - }); - }); - - describe('isEmptyObject', function() { - it('should work as advertised', function() { - assert.isTrue(isEmptyObject({})); - assert.isFalse(isEmptyObject({foo: 1})); - }); - }); - - describe('isError', function() { - it('should work as advertised', function() { - assert.isTrue(isError(new Error())); - assert.isTrue(isError(new ReferenceError())); - assert.isTrue(isError(new RavenConfigError())); - assert.isFalse(isError({})); - assert.isFalse(isError('')); - assert.isFalse(isError(true)); - }); - }); - - describe('objectMerge', function() { - it('should work as advertised', function() { - assert.deepEqual(objectMerge({}, {}), {}); - assert.deepEqual(objectMerge({a:1}, {b:2}), {a:1, b:2}); - assert.deepEqual(objectMerge({a:1}), {a:1}); - }); - }); - - describe('truncate', function() { - it('should work as advertised', function() { - assert.equal(truncate('lolol', 3), 'lol\u2026'); - assert.equal(truncate('lolol', 10), 'lolol'); - assert.equal(truncate('lol', 3), 'lol'); - }); - }); - - describe('isSetup', function() { - it('should return false with no JSON support', function() { - globalServer = 'http://localhost/'; - hasJSON = false; - assert.isFalse(isSetup()); - }); - - it('should return false when Raven is not configured', function() { - hasJSON = true; // be explicit - globalServer = undefined; - this.sinon.stub(window, 'logDebug'); - assert.isFalse(isSetup()); - }); - - it('should return true when everything is all gravy', function() { - hasJSON = true; - assert.isTrue(isSetup()); - }); - }); - - describe('logDebug', function() { - var level = 'error', - message = 'foobar'; - - it('should not write to console when Raven.debug is false', function() { - Raven.debug = false; - this.sinon.stub(console, level); - logDebug(level, message); - assert.isFalse(console[level].called); - }); - - it('should write to console when Raven.debug is true', function() { - Raven.debug = true; - this.sinon.stub(console, level); - logDebug(level, message); - assert.isTrue(console[level].calledOnce); - }); - }); - - describe('setAuthQueryString', function() { - it('should return a properly formatted string and cache it', function() { - var expected = '?sentry_version=4&sentry_client=raven-js/<%= pkg.version %>&sentry_key=abc'; - setAuthQueryString(); - assert.strictEqual(authQueryString, expected); - }); - }); - - describe('parseDSN', function() { - it('should do what it advertises', function() { - var pieces = parseDSN('http://abc@example.com:80/2'); - assert.strictEqual(pieces.protocol, 'http'); - assert.strictEqual(pieces.user, 'abc'); - assert.strictEqual(pieces.port, '80'); - assert.strictEqual(pieces.path, '/2'); - assert.strictEqual(pieces.host, 'example.com'); - }); - - it('should parse protocol relative', function() { - var pieces = parseDSN('//user@mattrobenolt.com/'); - assert.strictEqual(pieces.protocol, ''); - assert.strictEqual(pieces.user, 'user'); - assert.strictEqual(pieces.port, ''); - assert.strictEqual(pieces.path, '/'); - assert.strictEqual(pieces.host, 'mattrobenolt.com'); - }); - - it('should parse domain with hyphen', function() { - var pieces = parseDSN('http://user@matt-robenolt.com/1'); - assert.strictEqual(pieces.protocol, 'http'); - assert.strictEqual(pieces.user, 'user'); - assert.strictEqual(pieces.port, ''); - assert.strictEqual(pieces.path, '/1'); - assert.strictEqual(pieces.host, 'matt-robenolt.com'); - }); - - it('should raise a RavenConfigError when setting a password', function() { - try { - parseDSN('http://user:pass@example.com/2'); - } catch(e) { - return assert.equal(e.name, 'RavenConfigError'); - } - // shouldn't hit this - assert.isTrue(false); - }); - - it('should raise a RavenConfigError with an invalid DSN', function() { - try { - parseDSN('lol'); - } catch(e) { - return assert.equal(e.name, 'RavenConfigError'); - } - // shouldn't hit this - assert.isTrue(false); - }); - }); - - describe('normalizeFrame', function() { - it('should handle a normal frame', function() { - var context = [ - ['line1'], // pre - 'line2', // culprit - ['line3'] // post - ]; - this.sinon.stub(window, 'extractContextFromFrame').returns(context); - var frame = { - url: 'http://example.com/path/file.js', - line: 10, - column: 11, - func: 'lol' - // context: [] context is stubbed - }; - - globalOptions.fetchContext = true; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://example.com/path/file.js', - lineno: 10, - colno: 11, - 'function': 'lol', - pre_context: ['line1'], - context_line: 'line2', - post_context: ['line3'], - in_app: true - }); - }); - - it('should handle a frame without context', function() { - this.sinon.stub(window, 'extractContextFromFrame').returns(undefined); - var frame = { - url: 'http://example.com/path/file.js', - line: 10, - column: 11, - func: 'lol' - // context: [] context is stubbed - }; - - globalOptions.fetchContext = true; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://example.com/path/file.js', - lineno: 10, - colno: 11, - 'function': 'lol', - in_app: true - }); - }); - - it('should not mark `in_app` if rules match', function() { - this.sinon.stub(window, 'extractContextFromFrame').returns(undefined); - var frame = { - url: 'http://example.com/path/file.js', - line: 10, - column: 11, - func: 'lol' - // context: [] context is stubbed - }; - - globalOptions.fetchContext = true; - globalOptions.includePaths = /^http:\/\/example\.com/; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://example.com/path/file.js', - lineno: 10, - colno: 11, - 'function': 'lol', - in_app: true - }); - }); - - it('should mark `in_app` if rules do not match', function() { - this.sinon.stub(window, 'extractContextFromFrame').returns(undefined); - var frame = { - url: 'http://lol.com/path/file.js', - line: 10, - column: 11, - func: 'lol' - // context: [] context is stubbed - }; - - globalOptions.fetchContext = true; - globalOptions.includePaths = /^http:\/\/example\.com/; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://lol.com/path/file.js', - lineno: 10, - colno: 11, - 'function': 'lol', - in_app: false - }); - }); - - it('should mark `in_app` for raven.js', function() { - this.sinon.stub(window, 'extractContextFromFrame').returns(undefined); - var frame = { - url: 'http://lol.com/path/raven.js', - line: 10, - column: 11, - func: 'lol' - // context: [] context is stubbed - }; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://lol.com/path/raven.js', - lineno: 10, - colno: 11, - 'function': 'lol', - in_app: false - }); - }); - - it('should mark `in_app` for raven.min.js', function() { - this.sinon.stub(window, 'extractContextFromFrame').returns(undefined); - var frame = { - url: 'http://lol.com/path/raven.min.js', - line: 10, - column: 11, - func: 'lol' - // context: [] context is stubbed - }; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://lol.com/path/raven.min.js', - lineno: 10, - colno: 11, - 'function': 'lol', - in_app: false - }); - }); - - it('should mark `in_app` for Raven', function() { - this.sinon.stub(window, 'extractContextFromFrame').returns(undefined); - var frame = { - url: 'http://lol.com/path/file.js', - line: 10, - column: 11, - func: 'Raven.wrap' - // context: [] context is stubbed - }; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://lol.com/path/file.js', - lineno: 10, - colno: 11, - 'function': 'Raven.wrap', - in_app: false - }); - }); - - it('should mark `in_app` for TraceKit', function() { - this.sinon.stub(window, 'extractContextFromFrame').returns(undefined); - var frame = { - url: 'http://lol.com/path/file.js', - line: 10, - column: 11, - func: 'TraceKit.lol' - // context: [] context is stubbed - }; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://lol.com/path/file.js', - lineno: 10, - colno: 11, - 'function': 'TraceKit.lol', - in_app: false - }); - }); - }); - - describe('extractContextFromFrame', function() { - it('should handle a normal frame', function() { - var frame = { - column: 2, - context: [ - 'line1', - 'line2', - 'line3', - 'line4', - 'line5', - 'culprit', - 'line7', - 'line8', - 'line9', - 'line10', - 'line11' - ] - }; - var context = extractContextFromFrame(frame); - assert.deepEqual(context, [ - ['line1', 'line2', 'line3', 'line4', 'line5'], - 'culprit', - ['line7', 'line8', 'line9', 'line10', 'line11'] - ]); - }); - - it('should return nothing if there is no context', function() { - var frame = { - column: 2 - }; - assert.isUndefined(extractContextFromFrame(frame)); - }); - - it('should reject a context if a line is too long without a column', function() { - var frame = { - context: [ - new Array(1000).join('f') // generate a line that is 1000 chars long - ] - }; - assert.isUndefined(extractContextFromFrame(frame)); - }); - - it('should reject a minified context with fetchContext disabled', function() { - var frame = { - column: 2, - context: [ - 'line1', - 'line2', - 'line3', - 'line4', - 'line5', - 'culprit', - 'line7', - 'line8', - 'line9', - 'line10', - 'line11' - ] - }; - globalOptions.fetchContext = false; - assert.isUndefined(extractContextFromFrame(frame)); - }); - - it('should truncate the minified line if there is a column number without sourcemaps enabled', function() { - // Note to future self: - // Array(51).join('f').length === 50 - var frame = { - column: 2, - context: [ - 'aa' + (new Array(51).join('f')) + (new Array(500).join('z')) - ] - }; - assert.deepEqual(extractContextFromFrame(frame), [[], new Array(51).join('f'), []]); - }); - }); - - describe('processException', function() { - it('should respect `ignoreErrors`', function() { - this.sinon.stub(window, 'send'); - - globalOptions.ignoreErrors = joinRegExp(['e1', 'e2']); - processException('Error', 'e1', 'http://example.com', []); - assert.isFalse(window.send.called); - processException('Error', 'e2', 'http://example.com', []); - assert.isFalse(window.send.called); - processException('Error', 'error', 'http://example.com', []); - assert.isTrue(window.send.calledOnce); - }); - - it('should respect `ignoreUrls`', function() { - this.sinon.stub(window, 'send'); - - globalOptions.ignoreUrls = joinRegExp([/.+?host1.+/, /.+?host2.+/]); - processException('Error', 'error', 'http://host1/', []); - assert.isFalse(window.send.called); - processException('Error', 'error', 'http://host2/', []); - assert.isFalse(window.send.called); - processException('Error', 'error', 'http://host3/', []); - assert.isTrue(window.send.calledOnce); - }); - - it('should respect `whitelistUrls`', function() { - this.sinon.stub(window, 'send'); - - globalOptions.whitelistUrls = joinRegExp([/.+?host1.+/, /.+?host2.+/]); - processException('Error', 'error', 'http://host1/', []); - assert.equal(window.send.callCount, 1); - processException('Error', 'error', 'http://host2/', []); - assert.equal(window.send.callCount, 2); - processException('Error', 'error', 'http://host3/', []); - assert.equal(window.send.callCount, 2); - }); - - it('should send a proper payload with frames', function() { - this.sinon.stub(window, 'send'); - - var frames = [ - { - filename: 'http://example.com/file1.js' - }, - { - filename: 'http://example.com/file2.js' - } - ], framesFlipped = frames.slice(0); - - framesFlipped.reverse(); - - processException('Error', 'lol', 'http://example.com/override.js', 10, frames.slice(0), {}); - assert.deepEqual(window.send.lastCall.args, [{ - exception: { - type: 'Error', - value: 'lol' - }, - stacktrace: { - frames: framesFlipped - }, - culprit: 'http://example.com/file1.js', - message: 'lol at 10' - }]); - - processException('Error', 'lol', '', 10, frames.slice(0), {}); - assert.deepEqual(window.send.lastCall.args, [{ - exception: { - type: 'Error', - value: 'lol' - }, - stacktrace: { - frames: framesFlipped - }, - culprit: 'http://example.com/file1.js', - message: 'lol at 10' - }]); - - processException('Error', 'lol', '', 10, frames.slice(0), {extra: 'awesome'}); - assert.deepEqual(window.send.lastCall.args, [{ - exception: { - type: 'Error', - value: 'lol' - }, - stacktrace: { - frames: framesFlipped - }, - culprit: 'http://example.com/file1.js', - message: 'lol at 10', - extra: 'awesome' - }]); - }); - - it('should send a proper payload without frames', function() { - this.sinon.stub(window, 'send'); - - processException('Error', 'lol', 'http://example.com/override.js', 10, [], {}); - assert.deepEqual(window.send.lastCall.args, [{ - exception: { - type: 'Error', - value: 'lol' - }, - stacktrace: { - frames: [{ - filename: 'http://example.com/override.js', - lineno: 10, - in_app: true - }] - }, - culprit: 'http://example.com/override.js', - message: 'lol at 10' - }]); - - processException('Error', 'lol', 'http://example.com/override.js', 10, [], {}); - assert.deepEqual(window.send.lastCall.args, [{ - exception: { - type: 'Error', - value: 'lol' - }, - stacktrace: { - frames: [{ - filename: 'http://example.com/override.js', - lineno: 10, - in_app: true - }] - }, - culprit: 'http://example.com/override.js', - message: 'lol at 10' - }]); - - processException('Error', 'lol', 'http://example.com/override.js', 10, [], {extra: 'awesome'}); - assert.deepEqual(window.send.lastCall.args, [{ - exception: { - type: 'Error', - value: 'lol' - }, - stacktrace: { - frames: [{ - filename: 'http://example.com/override.js', - lineno: 10, - in_app: true - }] - }, - culprit: 'http://example.com/override.js', - message: 'lol at 10', - extra: 'awesome' - }]); - }); - - it('should ignored falsey messages', function() { - this.sinon.stub(window, 'send'); - - processException('Error', '', 'http://example.com', []); - assert.isFalse(window.send.called); - - processException('TypeError', '', 'http://example.com', []); - assert.isTrue(window.send.called); - }); - - it('should not blow up with `undefined` message', function() { - this.sinon.stub(window, 'send'); - - processException('TypeError', undefined, 'http://example.com', []); - assert.isTrue(window.send.called); - }); - - it('should truncate messages to the specified length', function() { - this.sinon.stub(window, 'send'); - - processException('TypeError', new Array(500).join('a'), 'http://example.com', []); - assert.deepEqual(window.send.lastCall.args, [{ - message: new Array(101).join('a')+'\u2026 at ', - exception: { - type: 'TypeError', - value: new Array(101).join('a')+'\u2026' - }, - stacktrace: { - frames: [{ - filename: 'http://example.com', - lineno: [], - in_app: true - }] - }, - culprit: 'http://example.com', - }]); - - globalOptions.maxMessageLength = 150; - - processException('TypeError', new Array(500).join('a'), 'http://example.com', []); - assert.deepEqual(window.send.lastCall.args, [{ - message: new Array(151).join('a')+'\u2026 at ', - exception: { - type: 'TypeError', - value: new Array(151).join('a')+'\u2026' - }, - stacktrace: { - frames: [{ - filename: 'http://example.com', - lineno: [], - in_app: true - }] - }, - culprit: 'http://example.com', - }]); - }); - }); - - describe('send', function() { - it('should check `isSetup`', function() { - this.sinon.stub(window, 'isSetup').returns(false); - this.sinon.stub(window, 'makeRequest'); - - send(); - assert.isTrue(window.isSetup.calledOnce); - assert.isFalse(window.makeRequest.calledOnce); - }); - - it('should build a good data payload', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - this.sinon.stub(window, 'getHttpData').returns({ - url: 'http://localhost/?a=b', - headers: {'User-Agent': 'lolbrowser'} - }); - - globalProject = '2'; - globalOptions = { - logger: 'javascript' - }; - - send({foo: 'bar'}); - assert.deepEqual(window.makeRequest.lastCall.args[0], { - project: '2', - logger: 'javascript', - platform: 'javascript', - request: { - url: 'http://localhost/?a=b', - headers: { - 'User-Agent': 'lolbrowser' - } - }, - event_id: 'abc123', - foo: 'bar', - extra: {'session:duration': 100} - }); - }); - - it('should build a good data payload with a User', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - this.sinon.stub(window, 'getHttpData').returns({ - url: 'http://localhost/?a=b', - headers: {'User-Agent': 'lolbrowser'} - }); - - globalProject = '2'; - globalOptions = { - logger: 'javascript' - }; - - globalUser = {name: 'Matt'}; - - send({foo: 'bar'}); - assert.deepEqual(window.makeRequest.lastCall.args, [{ - project: '2', - logger: 'javascript', - platform: 'javascript', - request: { - url: 'http://localhost/?a=b', - headers: { - 'User-Agent': 'lolbrowser' - } - }, - event_id: 'abc123', - user: { - name: 'Matt' - }, - foo: 'bar', - extra: {'session:duration': 100} - }]); - }); - - it('should merge in global tags', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - this.sinon.stub(window, 'getHttpData').returns({ - url: 'http://localhost/?a=b', - headers: {'User-Agent': 'lolbrowser'} - }); - - globalProject = '2'; - globalOptions = { - logger: 'javascript', - tags: {tag1: 'value1'} - }; - - - send({tags: {tag2: 'value2'}}); - assert.deepEqual(window.makeRequest.lastCall.args, [{ - project: '2', - logger: 'javascript', - platform: 'javascript', - request: { - url: 'http://localhost/?a=b', - headers: { - 'User-Agent': 'lolbrowser' - } - }, - event_id: 'abc123', - tags: {tag1: 'value1', tag2: 'value2'}, - extra: {'session:duration': 100} - }]); - assert.deepEqual(globalOptions, { - logger: 'javascript', - tags: {tag1: 'value1'} - }); - }); - - it('should merge in global extra', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - this.sinon.stub(window, 'getHttpData').returns({ - url: 'http://localhost/?a=b', - headers: {'User-Agent': 'lolbrowser'} - }); - - globalProject = '2'; - globalOptions = { - logger: 'javascript', - extra: {key1: 'value1'} - }; - - - send({extra: {key2: 'value2'}}); - assert.deepEqual(window.makeRequest.lastCall.args, [{ - project: '2', - logger: 'javascript', - platform: 'javascript', - request: { - url: 'http://localhost/?a=b', - headers: { - 'User-Agent': 'lolbrowser' - } - }, - event_id: 'abc123', - extra: {key1: 'value1', key2: 'value2', 'session:duration': 100} - }]); - assert.deepEqual(globalOptions, { - logger: 'javascript', - extra: {key1: 'value1'} - }); - }); - - it('should let dataCallback override everything', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - - globalOptions = { - projectId: 2, - logger: 'javascript', - dataCallback: function() { - return {lol: 'ibrokeit'}; - } - }; - - globalUser = {name: 'Matt'}; - - send({foo: 'bar'}); - assert.deepEqual(window.makeRequest.lastCall.args, [{ - lol: 'ibrokeit', - event_id: 'abc123', - }]); - }); - - it('should ignore dataCallback if it does not return anything', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - this.sinon.stub(window, 'getHttpData').returns({ - url: 'http://localhost/?a=b', - headers: {'User-Agent': 'lolbrowser'} - }); - - globalProject = '2'; - globalOptions = { - logger: 'javascript', - dataCallback: function() { - return; - } - }; - - send({foo: 'bar'}); - assert.deepEqual(window.makeRequest.lastCall.args[0], { - project: '2', - logger: 'javascript', - platform: 'javascript', - request: { - url: 'http://localhost/?a=b', - headers: { - 'User-Agent': 'lolbrowser' - } - }, - event_id: 'abc123', - foo: 'bar', - extra: {'session:duration': 100} - }); - }); - - it('should strip empty tags', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - this.sinon.stub(window, 'getHttpData').returns({ - url: 'http://localhost/?a=b', - headers: {'User-Agent': 'lolbrowser'} - }); - - globalOptions = { - projectId: 2, - logger: 'javascript', - tags: {} - }; - - send({foo: 'bar', tags: {}, extra: {}}); - assert.deepEqual(window.makeRequest.lastCall.args[0], { - project: '2', - logger: 'javascript', - platform: 'javascript', - request: { - url: 'http://localhost/?a=b', - headers: { - 'User-Agent': 'lolbrowser' - } - }, - event_id: 'abc123', - foo: 'bar', - extra: {'session:duration': 100} - }); - }); - - it('should attach release if available', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - this.sinon.stub(window, 'getHttpData').returns({ - url: 'http://localhost/?a=b', - headers: {'User-Agent': 'lolbrowser'} - }); - - globalOptions = { - projectId: 2, - logger: 'javascript', - release: 'abc123', - }; - - send({foo: 'bar'}); - assert.deepEqual(window.makeRequest.lastCall.args[0], { - project: '2', - release: 'abc123', - logger: 'javascript', - platform: 'javascript', - request: { - url: 'http://localhost/?a=b', - headers: { - 'User-Agent': 'lolbrowser' - } - }, - event_id: 'abc123', - foo: 'bar', - extra: {'session:duration': 100} - }); - }); - }); - - describe('makeRequest', function() { - it('should load an Image', function() { - authQueryString = '?lol'; - globalServer = 'http://localhost/'; - var imageCache = []; - this.sinon.stub(window, 'newImage', function(){ var img = {}; imageCache.push(img); return img; }); - - makeRequest({foo: 'bar'}); - assert.equal(imageCache.length, 1); - assert.equal(imageCache[0].src, 'http://localhost/?lol&sentry_data=%7B%22foo%22%3A%22bar%22%7D'); - }); - }); - - describe('handleStackInfo', function() { - it('should work as advertised', function() { - var frame = {url: 'http://example.com'}; - this.sinon.stub(window, 'normalizeFrame').returns(frame); - this.sinon.stub(window, 'processException'); - - var stackInfo = { - name: 'Matt', - message: 'hey', - url: 'http://example.com', - lineno: 10, - stack: [ - frame, frame - ] - }; - - handleStackInfo(stackInfo, {foo: 'bar'}); - assert.deepEqual(window.processException.lastCall.args, [ - 'Matt', 'hey', 'http://example.com', 10, [frame, frame], {foo: 'bar'} - ]); - }); - - it('should work as advertised #integration', function() { - this.sinon.stub(window, 'makeRequest'); - var stackInfo = { - name: 'Error', - message: 'crap', - url: 'http://example.com', - lineno: 10, - stack: [ - { - url: 'http://example.com/file1.js', - line: 10, - column: 11, - func: 'broken', - context: [ - 'line1', - 'line2', - 'line3' - ] - }, - { - url: 'http://example.com/file2.js', - line: 12, - column: 13, - func: 'lol', - context: [ - 'line4', - 'line5', - 'line6' - ] - } - ] - }; - - handleStackInfo(stackInfo, {foo: 'bar'}); - assert.isTrue(window.makeRequest.calledOnce); - /* This is commented out because chai is broken. - - assert.deepEqual(window.makeRequest.lastCall.args, [{ - project: '2', - logger: 'javascript', - platform: 'javascript', - request: { - url: window.location.protocol + '//' + window.location.host + window.location.pathname, - querystring: window.location.search.slice(1) - }, - exception: { - type: 'Error', - value: 'crap' - }, - stacktrace: { - frames: [{ - filename: 'http://example.com/file1.js', - filename: 'file1.js', - lineno: 10, - colno: 11, - 'function': 'broken', - post_context: ['line3'], - context_line: 'line2', - pre_context: ['line1'] - }, { - filename: 'http://example.com/file2.js', - filename: 'file2.js', - lineno: 12, - colno: 13, - 'function': 'lol', - post_context: ['line6'], - context_line: 'line5', - pre_context: ['line4'] - }] - }, - culprit: 'http://example.com', - message: 'crap at 10', - foo: 'bar' - }]); - */ - }); - - it('should ignore frames that dont have a url', function() { - this.sinon.stub(window, 'normalizeFrame').returns(undefined); - this.sinon.stub(window, 'processException'); - - var stackInfo = { - name: 'Matt', - message: 'hey', - url: 'http://example.com', - lineno: 10, - stack: new Array(2) - }; - - handleStackInfo(stackInfo, {foo: 'bar'}); - assert.deepEqual(window.processException.lastCall.args, [ - 'Matt', 'hey', 'http://example.com', 10, [], {foo: 'bar'} - ]); - }); - - it('should not shit when there is no stack object from TK', function() { - this.sinon.stub(window, 'normalizeFrame').returns(undefined); - this.sinon.stub(window, 'processException'); - - var stackInfo = { - name: 'Matt', - message: 'hey', - url: 'http://example.com', - lineno: 10 - // stack: new Array(2) - }; - - handleStackInfo(stackInfo); - assert.isFalse(window.normalizeFrame.called); - assert.deepEqual(window.processException.lastCall.args, [ - 'Matt', 'hey', 'http://example.com', 10, [], undefined - ]); - }); - - it('should detect 2-words patterns (angularjs frequent case)', function() { - this.sinon.stub(window, 'normalizeFrame').returns(undefined); - this.sinon.stub(window, 'processException'); - - var stackInfo = { - name: 'new ', - message: 'hey', - url: 'http://example.com', - lineno: 10 - // stack: new Array(2) - }; - - handleStackInfo(stackInfo); - assert.isFalse(window.normalizeFrame.called); - assert.deepEqual(window.processException.lastCall.args, [ - 'new ', 'hey', 'http://example.com', 10, [], undefined - ]); - }); - }); - - describe('joinRegExp', function() { - it('should work as advertised', function() { - assert.equal(joinRegExp([ - 'a', 'b', 'a.b', /d/, /[0-9]/ - ]).source, 'a|b|a\\.b|d|[0-9]'); - }); - - it('should not process empty or undefined variables', function() { - assert.equal(joinRegExp([ - 'a', 'b', null, undefined - ]).source, 'a|b'); - }); - - it('should skip entries that are not strings or regular expressions in the passed array of patterns', function() { - assert.equal(joinRegExp([ - 'a', 'b', null, 'a.b', undefined, true, /d/, 123, {}, /[0-9]/, [] - ]).source, 'a|b|a\\.b|d|[0-9]'); - }); - }); -}); - -describe('Raven (public API)', function() { - afterEach(function() { - flushRavenState(); - }); - - describe('.VERSION', function() { - it('should have a version', function() { - assert.isString(Raven.VERSION); - }); - }); - - describe('ignore errors', function() { - it('should install default ignore errors', function() { - Raven.config('//abc@example.com/2'); - - assert.isTrue(globalOptions.ignoreErrors.test('Script error'), 'it should install "Script error" by default'); - assert.isTrue(globalOptions.ignoreErrors.test('Script error.'), 'it should install "Script error." by default'); - assert.isTrue(globalOptions.ignoreErrors.test('Javascript error: Script error on line 0'), 'it should install "Javascript error: Script error on line 0" by default'); - assert.isTrue(globalOptions.ignoreErrors.test('Javascript error: Script error. on line 0'), 'it should install "Javascript error: Script error. on line 0" by default'); - }); - }); - - describe('callback function', function() { - it('should callback a function if it is global', function() { - window.RavenConfig = { - dsn: "http://random@some.other.server:80/2", - config: {some: 'config'} - }; - - this.sinon.stub(window, 'isSetup').returns(false); - this.sinon.stub(TraceKit.report, 'subscribe'); - - afterLoad(); - - assert.equal(globalKey, 'random'); - assert.equal(globalServer, 'http://some.other.server:80/api/2/store/'); - - assert.equal(globalOptions.some, 'config'); - assert.equal(globalProject, '2'); - - assert.isTrue(window.isSetup.calledOnce); - assert.isFalse(TraceKit.report.subscribe.calledOnce); - - delete window.RavenConfig; - }); - }); - - describe('.config', function() { - it('should work with a DSN', function() { - assert.equal(Raven, Raven.config(SENTRY_DSN, {foo: 'bar'}), 'it should return Raven'); - assert.equal(globalKey, 'abc'); - assert.equal(globalServer, 'http://example.com:80/api/2/store/'); - assert.equal(globalOptions.foo, 'bar'); - assert.equal(globalProject, '2'); - assert.isTrue(isSetup()); - }); - - it('should work with a protocol relative DSN', function() { - Raven.config('//abc@example.com/2'); - assert.equal(globalKey, 'abc'); - assert.equal(globalServer, '//example.com/api/2/store/'); - assert.equal(globalProject, '2'); - assert.isTrue(isSetup()); - }); - - it('should work should work at a non root path', function() { - Raven.config('//abc@example.com/sentry/2'); - assert.equal(globalKey, 'abc'); - assert.equal(globalServer, '//example.com/sentry/api/2/store/'); - assert.equal(globalProject, '2'); - assert.isTrue(isSetup()); - }); - - it('should noop a falsey dsn', function() { - Raven.config(''); - assert.isFalse(isSetup()); - }); - - it('should return Raven for a falsey dsn', function() { - assert.equal(Raven.config(''), Raven); - }); - - it('should not set global options more than once', function() { - this.sinon.spy(window, 'parseDSN'); - this.sinon.stub(window, 'logDebug'); - setupRaven(); - setupRaven(); - assert.isTrue(parseDSN.calledOnce); - assert.isTrue(logDebug.called); - }); - - describe('whitelistUrls', function() { - it('should be false if none are passed', function() { - Raven.config('//abc@example.com/2'); - assert.equal(globalOptions.whitelistUrls, false); - }); - - it('should join into a single RegExp', function() { - Raven.config('//abc@example.com/2', { - whitelistUrls: [ - /my.app/i, - /other.app/i - ] - }); - - assert.match(globalOptions.whitelistUrls, /my.app|other.app/i); - }); - - it('should handle strings as well', function() { - Raven.config('//abc@example.com/2', { - whitelistUrls: [ - /my.app/i, - "stringy.app" - ] - }); - - assert.match(globalOptions.whitelistUrls, /my.app|stringy.app/i); - }); - }); - - describe('collectWindowErrors', function() { - it('should be true by default', function() { - Raven.config(SENTRY_DSN); - assert.isTrue(TraceKit.collectWindowErrors); - }); - - it('should be true if set to true', function() { - Raven.config(SENTRY_DSN, { - collectWindowErrors: true - }); - - assert.isTrue(TraceKit.collectWindowErrors); - }); - - it('should be false if set to false', function() { - Raven.config(SENTRY_DSN, { - collectWindowErrors: false - }); - - assert.isFalse(TraceKit.collectWindowErrors); - }); - }); - }); - - describe('.install', function() { - it('should check `isSetup`', function() { - this.sinon.stub(window, 'isSetup').returns(false); - this.sinon.stub(TraceKit.report, 'subscribe'); - Raven.install(); - assert.isTrue(window.isSetup.calledOnce); - assert.isFalse(TraceKit.report.subscribe.calledOnce); - }); - - it('should register itself with TraceKit', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(TraceKit.report, 'subscribe'); - assert.equal(Raven, Raven.install()); - assert.isTrue(TraceKit.report.subscribe.calledOnce); - assert.equal(TraceKit.report.subscribe.lastCall.args[0], handleStackInfo); - }); - - it('should not register itself more than once', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(TraceKit.report, 'subscribe'); - Raven.install(); - Raven.install(); - assert.isTrue(TraceKit.report.subscribe.calledOnce); - }); - }); - - describe('.wrap', function() { - it('should return a wrapped callback', function() { - var spy = this.sinon.spy(); - var wrapped = Raven.wrap(spy); - assert.isFunction(wrapped); - assert.isTrue(wrapped.__raven__); - wrapped(); - assert.isTrue(spy.calledOnce); - }); - - it('should copy property when wrapping function', function() { - var func = function() {}; - func.test = true; - var wrapped = Raven.wrap(func); - assert.isTrue(wrapped.test); - }); - - it('should not copy prototype property when wrapping function', function() { - var func = function() {}; - func.prototype.test = true; - var wrapped = Raven.wrap(func); - assert.isUndefined(new wrapped().test); - }); - - it('should return the result of a wrapped function', function() { - var func = function() { return 'foo'; }; - var wrapped = Raven.wrap(func); - assert.equal(wrapped(), 'foo'); - }); - - it('should not wrap a non-function', function() { - assert.equal(Raven.wrap('lol'), 'lol'); - assert.equal(Raven.wrap({}, 'lol'), 'lol'); - assert.equal(Raven.wrap(undefined, 'lol'), 'lol'); - var a = [1, 2]; - assert.equal(Raven.wrap(a), a); - }); - - it('should wrap function arguments', function() { - var spy = this.sinon.spy(); - var wrapped = Raven.wrap(function(f) { - assert.isTrue(f.__raven__); - f(); - }); - wrapped(spy); - assert.isTrue(spy.calledOnce); - }); - - it('should not wrap function arguments', function() { - var spy = this.sinon.spy(); - var wrapped = Raven.wrap({ deep: false }, function(f) { - assert.isUndefined(f.__raven__); - f(); - }); - wrapped(spy); - assert.isTrue(spy.calledOnce); - }); - - it('should maintain the correct scope', function() { - var foo = {}; - var bar = function() { - assert.equal(this, foo); - }; - bar.apply(foo, []); - Raven.wrap(bar).apply(foo, []); - }); - - it('should re-raise a thrown exception', function() { - var error = new Error('lol'); - assert.throws(function() { - Raven.wrap(function() { throw error; })(); - }, error); - }); - - }); - - describe('.context', function() { - it('should execute the callback with options', function() { - var spy = this.sinon.spy(); - this.sinon.stub(Raven, 'captureException'); - Raven.context({'foo': 'bar'}, spy); - assert.isTrue(spy.calledOnce); - assert.isFalse(Raven.captureException.called); - }); - - it('should execute the callback with arguments', function() { - var spy = this.sinon.spy(); - var args = [1, 2]; - Raven.context(spy, args); - assert.deepEqual(spy.lastCall.args, args); - }); - - it('should execute the callback without options', function() { - var spy = this.sinon.spy(); - this.sinon.stub(Raven, 'captureException'); - Raven.context(spy); - assert.isTrue(spy.calledOnce); - assert.isFalse(Raven.captureException.called); - }); - - it('should capture the exception with options', function() { - var error = new Error('crap'); - var broken = function() { throw error; }; - this.sinon.stub(Raven, 'captureException'); - assert.throws(function() { - Raven.context({foo: 'bar'}, broken); - }, error); - assert.isTrue(Raven.captureException.called); - assert.deepEqual(Raven.captureException.lastCall.args, [error, {'foo': 'bar'}]); - }); - - it('should capture the exception without options', function() { - var error = new Error('crap'); - var broken = function() { throw error; }; - this.sinon.stub(Raven, 'captureException'); - assert.throws(function() { - Raven.context(broken); - }, error); - assert.isTrue(Raven.captureException.called); - assert.deepEqual(Raven.captureException.lastCall.args, [error, undefined]); - }); - - it('should execute the callback without arguments', function() { - // This is only reproducable in a browser that complains about passing - // undefined to Function.apply - var spy = this.sinon.spy(); - Raven.context(spy); - assert.deepEqual(spy.lastCall.args, []); - }); - - it('should return the result of the wrapped function', function() { - var val = {}; - var func = function() { return val; }; - assert.equal(Raven.context(func), val); - }); - }); - - describe('.uninstall', function() { - it('should uninstall from TraceKit', function() { - this.sinon.stub(TraceKit.report, 'uninstall'); - Raven.uninstall(); - assert.isTrue(TraceKit.report.uninstall.calledOnce); - }); - - it('should set isRavenInstalled flag to false', function() { - isRavenInstalled = true; - this.sinon.stub(TraceKit.report, 'uninstall'); - Raven.uninstall(); - assert.isFalse(isRavenInstalled); - }); - }); - - describe('.setUserContext', function() { - it('should set the globalUser object', function() { - Raven.setUserContext({name: 'Matt'}); - assert.deepEqual(globalUser, {name: 'Matt'}); - }); - - it('should clear the globalUser with no arguments', function() { - globalUser = {name: 'Matt'}; - Raven.setUserContext(); - assert.isUndefined(globalUser); - }); - }); - - describe('.setExtraContext', function() { - it('should set the globalOptions.extra object', function() { - Raven.setExtraContext({name: 'Matt'}); - assert.deepEqual(globalOptions.extra, {name: 'Matt'}); - }); - - it('should clear globalOptions.extra with no arguments', function() { - globalOptions = {name: 'Matt'}; - Raven.setExtraContext(); - assert.deepEqual(globalOptions.extra, {}); - }); - }); - - describe('.setTagsContext', function() { - it('should set the globalOptions.tags object', function() { - Raven.setTagsContext({name: 'Matt'}); - assert.deepEqual(globalOptions.tags, {name: 'Matt'}); - }); - - it('should clear globalOptions.tags with no arguments', function() { - globalOptions = {name: 'Matt'}; - Raven.setTagsContext(); - assert.deepEqual(globalOptions.tags, {}); - }); - }); - - describe('.setReleaseContext', function() { - it('should set the globalOptions.release attribute', function() { - Raven.setReleaseContext('abc123'); - assert.equal(globalOptions.release, 'abc123'); - }); - - it('should clear globalOptions.release with no arguments', function() { - globalOptions.release = 'abc123'; - Raven.setReleaseContext(); - assert.isUndefined(globalOptions.release); - }); - }); - - describe('.setDataCallback', function() { - it('should set the globalOptions.dataCallback attribute', function() { - var foo = function(){}; - Raven.setDataCallback(foo); - assert.equal(globalOptions.dataCallback, foo); - }); - - it('should clear globalOptions.dataCallback with no arguments', function() { - var foo = function(){}; - globalOptions.dataCallback = foo; - Raven.setDataCallback(); - assert.isUndefined(globalOptions.dataCallback); - }); - }); - - describe('.setShouldSendCallback', function() { - it('should set the globalOptions.shouldSendCallback attribute', function() { - var foo = function(){}; - Raven.setShouldSendCallback(foo); - assert.equal(globalOptions.shouldSendCallback, foo); - }); - - it('should clear globalOptions.shouldSendCallback with no arguments', function() { - var foo = function(){}; - globalOptions.shouldSendCallback = foo; - Raven.setShouldSendCallback(); - assert.isUndefined(globalOptions.shouldSendCallback); - }); - }); - - describe('.captureMessage', function() { - it('should work as advertised', function() { - this.sinon.stub(window, 'send'); - Raven.captureMessage('lol', {foo: 'bar'}); - assert.deepEqual(window.send.lastCall.args, [{ - message: 'lol', - foo: 'bar' - }]); - }); - - it('should coerce message to a string', function() { - this.sinon.stub(window, 'send'); - Raven.captureMessage({}); - assert.deepEqual(window.send.lastCall.args, [{ - message: '[object Object]' - }]); - }); - - it('should work as advertised #integration', function() { - var imageCache = []; - this.sinon.stub(window, 'newImage', function(){ var img = {}; imageCache.push(img); return img; }); - - setupRaven(); - Raven.captureMessage('lol', {foo: 'bar'}); - assert.equal(imageCache.length, 1); - // It'd be hard to assert the actual payload being sent - // since it includes the generated url, which is going to - // vary between users running the tests - // Unit tests should cover that the payload was constructed properly - }); - - it('should tag lastEventId #integration', function() { - setupRaven(); - Raven.captureMessage('lol'); - assert.equal(Raven.lastEventId(), 'abc123'); - }); - - it('should respect `ignoreErrors`', function() { - this.sinon.stub(window, 'send'); - - globalOptions.ignoreErrors = joinRegExp(['e1', 'e2']); - Raven.captureMessage('e1'); - assert.isFalse(window.send.called); - Raven.captureMessage('e2'); - assert.isFalse(window.send.called); - Raven.captureMessage('Non-ignored error'); - assert.isTrue(window.send.calledOnce); - }); - }); - - describe('.captureException', function() { - it('should call TraceKit.report', function() { - var error = new Error('crap'); - this.sinon.stub(TraceKit, 'report'); - Raven.captureException(error, {foo: 'bar'}); - assert.isTrue(TraceKit.report.calledOnce); - assert.deepEqual(TraceKit.report.lastCall.args, [error, {foo: 'bar'}]); - }); - - it('should store the last exception', function() { - var error = new Error('crap'); - this.sinon.stub(TraceKit, 'report'); - Raven.captureException(error); - assert.equal(Raven.lastException(), error); - }); - - it('shouldn\'t reraise the if the error is the same error', function() { - var error = new Error('crap'); - this.sinon.stub(TraceKit, 'report').throws(error); - // this would raise if the errors didn't match - Raven.captureException(error, {foo: 'bar'}); - assert.isTrue(TraceKit.report.calledOnce); - }); - - it('should reraise a different error', function() { - var error = new Error('crap1'); - this.sinon.stub(TraceKit, 'report').throws(error); - assert.throws(function() { - Raven.captureException(new Error('crap2')); - }, error); - }); - - it('should capture as a normal message if a non-Error is passed', function() { - this.sinon.stub(Raven, 'captureMessage'); - this.sinon.stub(TraceKit, 'report'); - Raven.captureException('derp'); - assert.equal(Raven.captureMessage.lastCall.args[0], 'derp'); - assert.isFalse(TraceKit.report.called); - Raven.captureException(true); - assert.equal(Raven.captureMessage.lastCall.args[0], true); - assert.isFalse(TraceKit.report.called); - }); - }); - - describe('.isSetup', function() { - it('should work as advertised', function() { - var isSetup = this.sinon.stub(window, 'isSetup'); - isSetup.returns(true); - assert.isTrue(Raven.isSetup()); - isSetup.returns(false); - assert.isFalse(Raven.isSetup()); - }); - }); -}); diff --git a/htdocs/includes/raven-js/vendor/TraceKit/tracekit.js b/htdocs/includes/raven-js/vendor/TraceKit/tracekit.js deleted file mode 100644 index bccddabedbe..00000000000 --- a/htdocs/includes/raven-js/vendor/TraceKit/tracekit.js +++ /dev/null @@ -1,1044 +0,0 @@ -/* - TraceKit - Cross brower stack traces - github.com/occ/TraceKit - MIT license -*/ - -var TraceKit = { - remoteFetching: false, - collectWindowErrors: true, - // 3 lines before, the offending line, 3 lines after - linesOfContext: 7 -}; - -// global reference to slice -var _slice = [].slice; -var UNKNOWN_FUNCTION = '?'; - - -/** - * TraceKit.wrap: Wrap any function in a TraceKit reporter - * Example: func = TraceKit.wrap(func); - * - * @param {Function} func Function to be wrapped - * @return {Function} The wrapped func - */ -TraceKit.wrap = function traceKitWrapper(func) { - function wrapped() { - try { - return func.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - } - return wrapped; -}; - -/** - * TraceKit.report: cross-browser processing of unhandled exceptions - * - * Syntax: - * TraceKit.report.subscribe(function(stackInfo) { ... }) - * TraceKit.report.unsubscribe(function(stackInfo) { ... }) - * TraceKit.report(exception) - * try { ...code... } catch(ex) { TraceKit.report(ex); } - * - * Supports: - * - Firefox: full stack trace with line numbers, plus column number - * on top frame; column number is not guaranteed - * - Opera: full stack trace with line and column numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - IE: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - * In theory, TraceKit should work on all of the following versions: - * - IE5.5+ (only 8.0 tested) - * - Firefox 0.9+ (only 3.5+ tested) - * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require - * Exceptions Have Stacktrace to be enabled in opera:config) - * - Safari 3+ (only 4+ tested) - * - Chrome 1+ (only 5+ tested) - * - Konqueror 3.5+ (untested) - * - * Requires TraceKit.computeStackTrace. - * - * Tries to catch all unhandled exceptions and report them to the - * subscribed handlers. Please note that TraceKit.report will rethrow the - * exception. This is REQUIRED in order to get a useful stack trace in IE. - * If the exception does not reach the top of the browser, you will only - * get a stack trace from the point where TraceKit.report was called. - * - * Handlers receive a stackInfo object as described in the - * TraceKit.computeStackTrace docs. - */ -TraceKit.report = (function reportModuleWrapper() { - var handlers = [], - lastArgs = null, - lastException = null, - lastExceptionStack = null; - - /** - * Add a crash handler. - * @param {Function} handler - */ - function subscribe(handler) { - installGlobalHandler(); - handlers.push(handler); - } - - /** - * Remove a crash handler. - * @param {Function} handler - */ - function unsubscribe(handler) { - for (var i = handlers.length - 1; i >= 0; --i) { - if (handlers[i] === handler) { - handlers.splice(i, 1); - } - } - } - - /** - * Remove all crash handlers. - */ - function unsubscribeAll() { - uninstallGlobalHandler(); - handlers = []; - } - - /** - * Dispatch stack information to all handlers. - * @param {Object.} stack - */ - function notifyHandlers(stack, isWindowError) { - var exception = null; - if (isWindowError && !TraceKit.collectWindowErrors) { - return; - } - for (var i in handlers) { - if (hasKey(handlers, i)) { - try { - handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2))); - } catch (inner) { - exception = inner; - } - } - } - - if (exception) { - throw exception; - } - } - - var _oldOnerrorHandler, _onErrorHandlerInstalled; - - /** - * Ensures all global unhandled exceptions are recorded. - * Supported by Gecko and IE. - * @param {string} message Error message. - * @param {string} url URL of script that generated the exception. - * @param {(number|string)} lineNo The line number at which the error - * occurred. - * @param {?(number|string)} colNo The column number at which the error - * occurred. - * @param {?Error} ex The actual Error object. - */ - function traceKitWindowOnError(message, url, lineNo, colNo, ex) { - var stack = null; - - if (lastExceptionStack) { - TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message); - processLastException(); - } else if (ex) { - // New chrome and blink send along a real error object - // Let's just report that like a normal error. - // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror - stack = TraceKit.computeStackTrace(ex); - notifyHandlers(stack, true); - } else { - var location = { - 'url': url, - 'line': lineNo, - 'column': colNo - }; - location.func = TraceKit.computeStackTrace.guessFunctionName(location.url, location.line); - location.context = TraceKit.computeStackTrace.gatherContext(location.url, location.line); - stack = { - 'message': message, - 'url': document.location.href, - 'stack': [location] - }; - notifyHandlers(stack, true); - } - - if (_oldOnerrorHandler) { - return _oldOnerrorHandler.apply(this, arguments); - } - - return false; - } - - function installGlobalHandler () - { - if (_onErrorHandlerInstalled) { - return; - } - _oldOnerrorHandler = window.onerror; - window.onerror = traceKitWindowOnError; - _onErrorHandlerInstalled = true; - } - - function uninstallGlobalHandler () - { - if (!_onErrorHandlerInstalled) { - return; - } - window.onerror = _oldOnerrorHandler; - _onErrorHandlerInstalled = false; - _oldOnerrorHandler = undefined; - } - - function processLastException() { - var _lastExceptionStack = lastExceptionStack, - _lastArgs = lastArgs; - lastArgs = null; - lastExceptionStack = null; - lastException = null; - notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs)); - } - - /** - * Reports an unhandled Error to TraceKit. - * @param {Error} ex - * @param {?boolean} rethrow If false, do not re-throw the exception. - * Only used for window.onerror to not cause an infinite loop of - * rethrowing. - */ - function report(ex, rethrow) { - var args = _slice.call(arguments, 1); - if (lastExceptionStack) { - if (lastException === ex) { - return; // already caught by an inner catch block, ignore - } else { - processLastException(); - } - } - - var stack = TraceKit.computeStackTrace(ex); - lastExceptionStack = stack; - lastException = ex; - lastArgs = args; - - // If the stack trace is incomplete, wait for 2 seconds for - // slow slow IE to see if onerror occurs or not before reporting - // this exception; otherwise, we will end up with an incomplete - // stack trace - window.setTimeout(function () { - if (lastException === ex) { - processLastException(); - } - }, (stack.incomplete ? 2000 : 0)); - - if (rethrow !== false) { - throw ex; // re-throw to propagate to the top level (and cause window.onerror) - } - } - - report.subscribe = subscribe; - report.unsubscribe = unsubscribe; - report.uninstall = unsubscribeAll; - return report; -}()); - -/** - * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript - * - * Syntax: - * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below) - * Returns: - * s.name - exception name - * s.message - exception message - * s.stack[i].url - JavaScript or HTML file URL - * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work) - * s.stack[i].args - arguments passed to the function, if known - * s.stack[i].line - line number, if known - * s.stack[i].column - column number, if known - * s.stack[i].context - an array of source code lines; the middle element corresponds to the correct line# - * - * Supports: - * - Firefox: full stack trace with line numbers and unreliable column - * number on top frame - * - Opera 10: full stack trace with line and column numbers - * - Opera 9-: full stack trace with line numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the topmost stacktrace element - * only - * - IE: no line numbers whatsoever - * - * Tries to guess names of anonymous functions by looking for assignments - * in the source code. In IE and Safari, we have to guess source file names - * by searching for function bodies inside all page scripts. This will not - * work for scripts that are loaded cross-domain. - * Here be dragons: some function names may be guessed incorrectly, and - * duplicate functions may be mismatched. - * - * TraceKit.computeStackTrace should only be used for tracing purposes. - * Logging of unhandled exceptions should be done with TraceKit.report, - * which builds on top of TraceKit.computeStackTrace and provides better - * IE support by utilizing the window.onerror event to retrieve information - * about the top of the stack. - * - * Note: In IE and Safari, no stack trace is recorded on the Error object, - * so computeStackTrace instead walks its *own* chain of callers. - * This means that: - * * in Safari, some methods may be missing from the stack trace; - * * in IE, the topmost function in the stack trace will always be the - * caller of computeStackTrace. - * - * This is okay for tracing (because you are likely to be calling - * computeStackTrace from the function you want to be the topmost element - * of the stack trace anyway), but not okay for logging unhandled - * exceptions (because your catch block will likely be far away from the - * inner function that actually caused the exception). - * - */ -TraceKit.computeStackTrace = (function computeStackTraceWrapper() { - var debug = false, - sourceCache = {}; - - /** - * Attempts to retrieve source code via XMLHttpRequest, which is used - * to look up anonymous function names. - * @param {string} url URL of source code. - * @return {string} Source contents. - */ - function loadSource(url) { - if (!TraceKit.remoteFetching) { //Only attempt request if remoteFetching is on. - return ''; - } - try { - var getXHR = function() { - try { - return new window.XMLHttpRequest(); - } catch (e) { - // explicitly bubble up the exception if not found - return new window.ActiveXObject('Microsoft.XMLHTTP'); - } - }; - - var request = getXHR(); - request.open('GET', url, false); - request.send(''); - return request.responseText; - } catch (e) { - return ''; - } - } - - /** - * Retrieves source code from the source code cache. - * @param {string} url URL of source code. - * @return {Array.} Source contents. - */ - function getSource(url) { - if (!isString(url)) return []; - if (!hasKey(sourceCache, url)) { - // URL needs to be able to fetched within the acceptable domain. Otherwise, - // cross-domain errors will be triggered. - var source = ''; - if (url.indexOf(document.domain) !== -1) { - source = loadSource(url); - } - sourceCache[url] = source ? source.split('\n') : []; - } - - return sourceCache[url]; - } - - /** - * Tries to use an externally loaded copy of source code to determine - * the name of a function by looking at the name of the variable it was - * assigned to, if any. - * @param {string} url URL of source code. - * @param {(string|number)} lineNo Line number in source code. - * @return {string} The function name, if discoverable. - */ - function guessFunctionName(url, lineNo) { - var reFunctionArgNames = /function ([^(]*)\(([^)]*)\)/, - reGuessFunction = /['"]?([0-9A-Za-z$_]+)['"]?\s*[:=]\s*(function|eval|new Function)/, - line = '', - maxLines = 10, - source = getSource(url), - m; - - if (!source.length) { - return UNKNOWN_FUNCTION; - } - - // Walk backwards from the first line in the function until we find the line which - // matches the pattern above, which is the function definition - for (var i = 0; i < maxLines; ++i) { - line = source[lineNo - i] + line; - - if (!isUndefined(line)) { - if ((m = reGuessFunction.exec(line))) { - return m[1]; - } else if ((m = reFunctionArgNames.exec(line))) { - return m[1]; - } - } - } - - return UNKNOWN_FUNCTION; - } - - /** - * Retrieves the surrounding lines from where an exception occurred. - * @param {string} url URL of source code. - * @param {(string|number)} line Line number in source code to centre - * around for context. - * @return {?Array.} Lines of source code. - */ - function gatherContext(url, line) { - var source = getSource(url); - - if (!source.length) { - return null; - } - - var context = [], - // linesBefore & linesAfter are inclusive with the offending line. - // if linesOfContext is even, there will be one extra line - // *before* the offending line. - linesBefore = Math.floor(TraceKit.linesOfContext / 2), - // Add one extra line if linesOfContext is odd - linesAfter = linesBefore + (TraceKit.linesOfContext % 2), - start = Math.max(0, line - linesBefore - 1), - end = Math.min(source.length, line + linesAfter - 1); - - line -= 1; // convert to 0-based index - - for (var i = start; i < end; ++i) { - if (!isUndefined(source[i])) { - context.push(source[i]); - } - } - - return context.length > 0 ? context : null; - } - - /** - * Escapes special characters, except for whitespace, in a string to be - * used inside a regular expression as a string literal. - * @param {string} text The string. - * @return {string} The escaped string literal. - */ - function escapeRegExp(text) { - return text.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g, '\\$&'); - } - - /** - * Escapes special characters in a string to be used inside a regular - * expression as a string literal. Also ensures that HTML entities will - * be matched the same as their literal friends. - * @param {string} body The string. - * @return {string} The escaped string. - */ - function escapeCodeAsRegExpForMatchingInsideHTML(body) { - return escapeRegExp(body).replace('<', '(?:<|<)').replace('>', '(?:>|>)').replace('&', '(?:&|&)').replace('"', '(?:"|")').replace(/\s+/g, '\\s+'); - } - - /** - * Determines where a code fragment occurs in the source code. - * @param {RegExp} re The function definition. - * @param {Array.} urls A list of URLs to search. - * @return {?Object.} An object containing - * the url, line, and column number of the defined function. - */ - function findSourceInUrls(re, urls) { - var source, m; - for (var i = 0, j = urls.length; i < j; ++i) { - // console.log('searching', urls[i]); - if ((source = getSource(urls[i])).length) { - source = source.join('\n'); - if ((m = re.exec(source))) { - // console.log('Found function in ' + urls[i]); - - return { - 'url': urls[i], - 'line': source.substring(0, m.index).split('\n').length, - 'column': m.index - source.lastIndexOf('\n', m.index) - 1 - }; - } - } - } - - // console.log('no match'); - - return null; - } - - /** - * Determines at which column a code fragment occurs on a line of the - * source code. - * @param {string} fragment The code fragment. - * @param {string} url The URL to search. - * @param {(string|number)} line The line number to examine. - * @return {?number} The column number. - */ - function findSourceInLine(fragment, url, line) { - var source = getSource(url), - re = new RegExp('\\b' + escapeRegExp(fragment) + '\\b'), - m; - - line -= 1; - - if (source && source.length > line && (m = re.exec(source[line]))) { - return m.index; - } - - return null; - } - - /** - * Determines where a function was defined within the source code. - * @param {(Function|string)} func A function reference or serialized - * function definition. - * @return {?Object.} An object containing - * the url, line, and column number of the defined function. - */ - function findSourceByFunctionBody(func) { - var urls = [window.location.href], - scripts = document.getElementsByTagName('script'), - body, - code = '' + func, - codeRE = /^function(?:\s+([\w$]+))?\s*\(([\w\s,]*)\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/, - eventRE = /^function on([\w$]+)\s*\(event\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/, - re, - parts, - result; - - for (var i = 0; i < scripts.length; ++i) { - var script = scripts[i]; - if (script.src) { - urls.push(script.src); - } - } - - if (!(parts = codeRE.exec(code))) { - re = new RegExp(escapeRegExp(code).replace(/\s+/g, '\\s+')); - } - - // not sure if this is really necessary, but I don’t have a test - // corpus large enough to confirm that and it was in the original. - else { - var name = parts[1] ? '\\s+' + parts[1] : '', - args = parts[2].split(',').join('\\s*,\\s*'); - - body = escapeRegExp(parts[3]).replace(/;$/, ';?'); // semicolon is inserted if the function ends with a comment.replace(/\s+/g, '\\s+'); - re = new RegExp('function' + name + '\\s*\\(\\s*' + args + '\\s*\\)\\s*{\\s*' + body + '\\s*}'); - } - - // look for a normal function definition - if ((result = findSourceInUrls(re, urls))) { - return result; - } - - // look for an old-school event handler function - if ((parts = eventRE.exec(code))) { - var event = parts[1]; - body = escapeCodeAsRegExpForMatchingInsideHTML(parts[2]); - - // look for a function defined in HTML as an onXXX handler - re = new RegExp('on' + event + '=[\\\'"]\\s*' + body + '\\s*[\\\'"]', 'i'); - - if ((result = findSourceInUrls(re, urls[0]))) { - return result; - } - - // look for ??? - re = new RegExp(body); - - if ((result = findSourceInUrls(re, urls))) { - return result; - } - } - - return null; - } - - // Contents of Exception in various browsers. - // - // SAFARI: - // ex.message = Can't find variable: qq - // ex.line = 59 - // ex.sourceId = 580238192 - // ex.sourceURL = http://... - // ex.expressionBeginOffset = 96 - // ex.expressionCaretOffset = 98 - // ex.expressionEndOffset = 98 - // ex.name = ReferenceError - // - // FIREFOX: - // ex.message = qq is not defined - // ex.fileName = http://... - // ex.lineNumber = 59 - // ex.columnNumber = 69 - // ex.stack = ...stack trace... (see the example below) - // ex.name = ReferenceError - // - // CHROME: - // ex.message = qq is not defined - // ex.name = ReferenceError - // ex.type = not_defined - // ex.arguments = ['aa'] - // ex.stack = ...stack trace... - // - // INTERNET EXPLORER: - // ex.message = ... - // ex.name = ReferenceError - // - // OPERA: - // ex.message = ...message... (see the example below) - // ex.name = ReferenceError - // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message) - // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace' - - /** - * Computes stack trace information from the stack property. - * Chrome and Gecko use this property. - * @param {Error} ex - * @return {?Object.} Stack trace information. - */ - function computeStackTraceFromStackProp(ex) { - if (!ex.stack) { - return null; - } - - var chrome = /^\s*at (.*?) ?\(?((?:file|https?|chrome-extension):.*?):(\d+)(?::(\d+))?\)?\s*$/i, - gecko = /^\s*(.*?)(?:\((.*?)\))?@((?:file|https?|chrome).*?):(\d+)(?::(\d+))?\s*$/i, - lines = ex.stack.split('\n'), - stack = [], - parts, - element, - reference = /^(.*) is undefined$/.exec(ex.message); - - for (var i = 0, j = lines.length; i < j; ++i) { - if ((parts = gecko.exec(lines[i]))) { - element = { - 'url': parts[3], - 'func': parts[1] || UNKNOWN_FUNCTION, - 'args': parts[2] ? parts[2].split(',') : '', - 'line': +parts[4], - 'column': parts[5] ? +parts[5] : null - }; - } else if ((parts = chrome.exec(lines[i]))) { - element = { - 'url': parts[2], - 'func': parts[1] || UNKNOWN_FUNCTION, - 'line': +parts[3], - 'column': parts[4] ? +parts[4] : null - }; - } else { - continue; - } - - if (!element.func && element.line) { - element.func = guessFunctionName(element.url, element.line); - } - - if (element.line) { - element.context = gatherContext(element.url, element.line); - } - - stack.push(element); - } - - if (!stack.length) { - return null; - } - - if (stack[0].line && !stack[0].column && reference) { - stack[0].column = findSourceInLine(reference[1], stack[0].url, stack[0].line); - } else if (!stack[0].column && !isUndefined(ex.columnNumber)) { - // FireFox uses this awesome columnNumber property for its top frame - // Also note, Firefox's column number is 0-based and everything else expects 1-based, - // so adding 1 - stack[0].column = ex.columnNumber + 1; - } - - return { - 'name': ex.name, - 'message': ex.message, - 'url': document.location.href, - 'stack': stack - }; - } - - /** - * Computes stack trace information from the stacktrace property. - * Opera 10 uses this property. - * @param {Error} ex - * @return {?Object.} Stack trace information. - */ - function computeStackTraceFromStacktraceProp(ex) { - // Access and store the stacktrace property before doing ANYTHING - // else to it because Opera is not very good at providing it - // reliably in other circumstances. - var stacktrace = ex.stacktrace; - - var testRE = / line (\d+), column (\d+) in (?:]+)>|([^\)]+))\((.*)\) in (.*):\s*$/i, - lines = stacktrace.split('\n'), - stack = [], - parts; - - for (var i = 0, j = lines.length; i < j; i += 2) { - if ((parts = testRE.exec(lines[i]))) { - var element = { - 'line': +parts[1], - 'column': +parts[2], - 'func': parts[3] || parts[4], - 'args': parts[5] ? parts[5].split(',') : [], - 'url': parts[6] - }; - - if (!element.func && element.line) { - element.func = guessFunctionName(element.url, element.line); - } - if (element.line) { - try { - element.context = gatherContext(element.url, element.line); - } catch (exc) {} - } - - if (!element.context) { - element.context = [lines[i + 1]]; - } - - stack.push(element); - } - } - - if (!stack.length) { - return null; - } - - return { - 'name': ex.name, - 'message': ex.message, - 'url': document.location.href, - 'stack': stack - }; - } - - /** - * NOT TESTED. - * Computes stack trace information from an error message that includes - * the stack trace. - * Opera 9 and earlier use this method if the option to show stack - * traces is turned on in opera:config. - * @param {Error} ex - * @return {?Object.} Stack information. - */ - function computeStackTraceFromOperaMultiLineMessage(ex) { - // Opera includes a stack trace into the exception message. An example is: - // - // Statement on line 3: Undefined variable: undefinedFunc - // Backtrace: - // Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js: In function zzz - // undefinedFunc(a); - // Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function yyy - // zzz(x, y, z); - // Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function xxx - // yyy(a, a, a); - // Line 1 of function script - // try { xxx('hi'); return false; } catch(ex) { TraceKit.report(ex); } - // ... - - var lines = ex.message.split('\n'); - if (lines.length < 4) { - return null; - } - - var lineRE1 = /^\s*Line (\d+) of linked script ((?:file|https?)\S+)(?:: in function (\S+))?\s*$/i, - lineRE2 = /^\s*Line (\d+) of inline#(\d+) script in ((?:file|https?)\S+)(?:: in function (\S+))?\s*$/i, - lineRE3 = /^\s*Line (\d+) of function script\s*$/i, - stack = [], - scripts = document.getElementsByTagName('script'), - inlineScriptBlocks = [], - parts, - i, - len, - source; - - for (i in scripts) { - if (hasKey(scripts, i) && !scripts[i].src) { - inlineScriptBlocks.push(scripts[i]); - } - } - - for (i = 2, len = lines.length; i < len; i += 2) { - var item = null; - if ((parts = lineRE1.exec(lines[i]))) { - item = { - 'url': parts[2], - 'func': parts[3], - 'line': +parts[1] - }; - } else if ((parts = lineRE2.exec(lines[i]))) { - item = { - 'url': parts[3], - 'func': parts[4] - }; - var relativeLine = (+parts[1]); // relative to the start of the - - - - - - -TraceKit specific optional settings -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Usually there is no need to touch these settings, but they exist in case you need to tweak something. - -fetchContext ------------- - -Enable TraceKit to attempt to fetch source files to look up anonymous function names, this can be useful to enable if you don't get the context for some entries in the stack trace. Default value is ``false``. - -.. code-block:: javascript - - { - fetchContext: true - } - -linesOfContext --------------- - -The count of lines surrounding the error line that should be used as context in the stack trace, default value is ``11``. Only applicable when ``fetchContext` is enabled. - -.. code-block:: javascript - - { - linesOfContext: 11 - } - -collectWindowErrors -------------------- - -Enable or disable the TraceKit ``window.onerror`` handler, default value is ``true``. - -.. code-block:: javascript - - { - collectWindowErrors: true - } diff --git a/htdocs/includes/raven-js/docs/contributing/index.rst b/htdocs/includes/raven-js/docs/contributing/index.rst deleted file mode 100644 index 2b25abf7f16..00000000000 --- a/htdocs/includes/raven-js/docs/contributing/index.rst +++ /dev/null @@ -1,99 +0,0 @@ -Contributing -============ - -Setting up an Environment -~~~~~~~~~~~~~~~~~~~~~~~~~ - -To run the test suite and run our code linter, node.js and npm are required. If you don't have node installed, `get it here `_ first. - -Installing all other dependencies is as simple as: - -.. code-block:: sh - - $ npm install - -And if you don't have `Grunt `_ already, feel free to install that globally: - -.. code-block:: sh - - $ npm install -g grunt-cli - -Running the Test Suite -~~~~~~~~~~~~~~~~~~~~~~ - -The test suite is powered by `Mocha `_ and can both run from the command line, or in the browser. - -From the command line: - -.. code-block:: sh - - $ grunt test - -From your browser: - -.. code-block:: sh - - $ grunt run:test - -Then visit: http://localhost:8000/test/ - -Compiling Raven.js -~~~~~~~~~~~~~~~~~~ - -The simplest way to compile your own version of Raven.js is with the supplied grunt command: - -.. code-block:: sh - - $ grunt build - -By default, this will compile raven.js and all of the included plugins. - -If you only want to compile the core raven.js: - -.. code-block:: sh - - $ grunt build.core - -Files are compiled into ``build/``. - -Contributing Back Code -~~~~~~~~~~~~~~~~~~~~~~ - -Please, send over suggestions and bug fixes in the form of pull requests on `GitHub `_. Any nontrivial fixes/features should include tests. -Do not include any changes to the ``dist/`` folder or bump version numbers yourself. - -Documentation -------------- - -The documentation is written using `reStructuredText `_, and compiled using `Sphinx `_. If you don't have Sphinx installed, you can do it using following command (assuming you have Python already installed in your system): - -.. code-block:: sh - - $ pip install sphinx - -Documentation can be then compiled by running: - -.. code-block:: sh - - $ make docs - -Afterwards you can view it in your browser by running following command and than pointing your browser to http://127.0.0.1:8000/: - -.. code-block:: sh - - $ grunt run:docs - - - -Releasing New Version -~~~~~~~~~~~~~~~~~~~~~ - -* Bump version numbers in both ``package.json`` and ``bower.json``. -* ``$ grunt dist`` This will compile a new version and update it in the ``dist/`` folder. -* Confirm that build was fine, etc. -* Commit new version, create a tag. Push to GitHub. -* ``$ grunt publish`` to recompile all plugins and all permutations and upload to S3. -* ``$ npm publish`` to push to npm. -* Confirm that the new version exists behind ``cdn.ravenjs.com`` -* Update version in the ``gh-pages`` branch specifically for http://ravenjs.com/. -* glhf diff --git a/htdocs/includes/raven-js/docs/index.rst b/htdocs/includes/raven-js/docs/index.rst deleted file mode 100644 index afe07bc9ab9..00000000000 --- a/htdocs/includes/raven-js/docs/index.rst +++ /dev/null @@ -1,42 +0,0 @@ -Raven.js -======== - -Raven.js is a tiny standalone JavaScript client for `Sentry `_. - -**This version of Raven.js requires Sentry 6.0 or newer.** - - -Getting Started ---------------- - -.. toctree:: - :maxdepth: 2 - - install/index - plugins/index - config/index - usage/index - tips/index - -Developers ----------- -.. toctree:: - :maxdepth: 2 - - contributing/index - -What's New? ------------ -.. toctree:: - :maxdepth: 2 - - changelog/index - -Resources ---------- -* `Download `_ -* `Bug Tracker `_ -* `Code `_ -* `IRC `_ (irc.freenode.net, #sentry) -* :doc:`Changelog ` -* Follow `@mattrobenolt `_ on Twitter for updates! diff --git a/htdocs/includes/raven-js/docs/install/index.rst b/htdocs/includes/raven-js/docs/install/index.rst deleted file mode 100644 index 17feda4e08e..00000000000 --- a/htdocs/includes/raven-js/docs/install/index.rst +++ /dev/null @@ -1,61 +0,0 @@ -Installation -============ - -Raven is distributed in a few different methods, and should get included after any other libraries are included, but before your own scripts. - -So for example: - -.. parsed-literal:: - - - - - - -This allows the ability for Raven's plugins to instrument themselves. If included before something like jQuery, it'd be impossible to use for example, the jquery plugin. - -Using our CDN -~~~~~~~~~~~~~ - -We serve our own builds off of `Fastly `_. They are accessible over both http and https, so we recommend leaving the protocol off. - -Our CDN distributes builds with and without :doc:`plugins `. - -.. parsed-literal:: - - - -**We highly recommend trying out a plugin or two since it'll greatly improve the chances that we can collect good information.** - -This version does not include any plugins. See `ravenjs.com `_ for more information about plugins and getting other builds. - -Bower -~~~~~ - -We also provide a way to deploy Raven via `bower -`_. Useful if you want serve your own scripts instead of depending on our CDN and mantain a ``bower.json`` with a list of dependencies and versions (adding the ``--save`` flag would automatically add it to ``bower.json``). - -.. code-block:: sh - - $ bower install raven-js --save - -.. code-block:: html - - - -Also note that the file is uncompresed but is ready to pass to any decent JavaScript compressor like `uglify `_. - -npm -~~~ - -Raven is published to npm as well. https://www.npmjs.com/package/raven-js - -.. code-block:: sh - - $ npm install raven-js --save - -Requirements -~~~~~~~~~~~~ - -Raven expects the browser to provide `window.JSON` and `window.JSON.stringify`. In Internet Explorer 8+ these are available in `standards mode `_. -You can also use `json2.js `_ to provide the JSON implementation in browsers/modes which doesn't support native JSON diff --git a/htdocs/includes/raven-js/docs/make.bat b/htdocs/includes/raven-js/docs/make.bat deleted file mode 100644 index 13e2848a47d..00000000000 --- a/htdocs/includes/raven-js/docs/make.bat +++ /dev/null @@ -1,190 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=_build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\raven-js.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\raven-js.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -:end diff --git a/htdocs/includes/raven-js/docs/plugins/index.rst b/htdocs/includes/raven-js/docs/plugins/index.rst deleted file mode 100644 index 7a9df7b019e..00000000000 --- a/htdocs/includes/raven-js/docs/plugins/index.rst +++ /dev/null @@ -1,20 +0,0 @@ -Plugins -======= - -What are plugins? -~~~~~~~~~~~~~~~~~ - -In Raven.js, plugins are little snippets of code to augment functionality for a specific application/framework. It is highly recommended to checkout the list of plugins and use what apply to your project. - -In order to keep the core small, we have opted to only include the most basic functionality by default, and you can pick and choose which plugins are applicable for you. - -Why are plugins needed at all? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -JavaScript is pretty restrictive when it comes to exception handling, and there are a lot of things that make it difficult to get relevent information, so it's important that we inject code and wrap things magically so we can extract what we need. See :doc:`/usage/index` for tips regarding that. - - -All Plugins -~~~~~~~~~~~ -* https://github.com/getsentry/raven-js/tree/master/plugins -* `Download `_ diff --git a/htdocs/includes/raven-js/docs/tips/index.rst b/htdocs/includes/raven-js/docs/tips/index.rst deleted file mode 100644 index 8dee09eb7ef..00000000000 --- a/htdocs/includes/raven-js/docs/tips/index.rst +++ /dev/null @@ -1,79 +0,0 @@ -Pro Tips™ -========= - - -Decluttering Sentry -~~~~~~~~~~~~~~~~~~~ - -The first thing to do is to consider constructing a whitelist of domains in which might raise acceptable exceptions. - -If your scripts are loaded from ``cdn.example.com`` and your site is ``example.com`` it'd be reasonable to set ``whitelistUrls`` to: - -.. code-block:: javascript - - whitelistUrls: [ - /https?:\/\/((cdn|www)\.)?example\.com/ - ] - -Since this accepts a regular expression, that would catch anything \*.example.com or example.com exactly. See also: :ref:`Config: whitelistUrls`. - -Next, checkout the list of :doc:`plugins ` we provide and see which are applicable to you. - -The community has compiled a list of common ignore rules for common things, like Facebook, Chrome extensions, etc. So it's recommended to at least check these out and see if they apply to you. `Check out the original gist `_. - -.. code-block:: javascript - - var ravenOptions = { - ignoreErrors: [ - // Random plugins/extensions - 'top.GLOBALS', - // See: http://blog.errorception.com/2012/03/tale-of-unfindable-js-error. html - 'originalCreateNotification', - 'canvas.contentDocument', - 'MyApp_RemoveAllHighlights', - 'http://tt.epicplay.com', - 'Can\'t find variable: ZiteReader', - 'jigsaw is not defined', - 'ComboSearch is not defined', - 'http://loading.retry.widdit.com/', - 'atomicFindClose', - // Facebook borked - 'fb_xd_fragment', - // ISP "optimizing" proxy - `Cache-Control: no-transform` seems to reduce this. (thanks @acdha) - // See http://stackoverflow.com/questions/4113268/how-to-stop-javascript-injection-from-vodafone-proxy - 'bmi_SafeAddOnload', - 'EBCallBackMessageReceived', - // See http://toolbar.conduit.com/Developer/HtmlAndGadget/Methods/JSInjection.aspx - 'conduitPage' - ], - ignoreUrls: [ - // Facebook flakiness - /graph\.facebook\.com/i, - // Facebook blocked - /connect\.facebook\.net\/en_US\/all\.js/i, - // Woopra flakiness - /eatdifferent\.com\.woopra-ns\.com/i, - /static\.woopra\.com\/js\/woopra\.js/i, - // Chrome extensions - /extensions\//i, - /^chrome:\/\//i, - // Other plugins - /127\.0\.0\.1:4001\/isrunning/i, // Cacaoweb - /webappstoolbarba\.texthelp\.com\//i, - /metrics\.itunes\.apple\.com\.edgesuite\.net\//i - ] - }; - - -Sampling Data -~~~~~~~~~~~~~ - -It happens frequently that errors sent from your frontend can be overwhelming. One solution here is to only send a sample of the events that happen. You can do this via the ``shouldSendCallback`` setting: - -.. code-block:: javascript - - shouldSendCallback: function(data) { - // only send 10% of errors - var sampleRate = 10; - return (Math.random() * 100 <= sampleRate); - } diff --git a/htdocs/includes/raven-js/docs/usage/index.rst b/htdocs/includes/raven-js/docs/usage/index.rst deleted file mode 100644 index c8e01f9c801..00000000000 --- a/htdocs/includes/raven-js/docs/usage/index.rst +++ /dev/null @@ -1,156 +0,0 @@ -Usage -===== - -By default, Raven makes a few efforts to try its best to capture meaningful stack traces, but browsers make it pretty difficult. - -The easiest solution is to prevent an error from bubbling all of the way up the stack to ``window``. - -How to actually capture an error correctly -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -try...catch ------------ - -The simplest way, is to try and explicitly capture and report potentially problematic code with a ``try...catch`` block and ``Raven.captureException``. - -.. code-block:: javascript - - try { - doSomething(a[0]) - } catch(e) { - Raven.captureException(e) - } - -**Do not** throw strings! Always throw an actual ``Error`` object. For example: - -.. code-block:: javascript - - throw new Error('broken') // good - throw 'broken' // bad - -It's impossible to retrieve a stack trace from a string. If this happens, Raven transmits the error as a plain message. - -context/wrap ------------- - -``Raven.context`` allows you to wrap any function to be immediately executed. Behind the scenes, Raven is just wrapping your code in a ``try...catch`` block to record the exception before re-throwing it. - -.. code-block:: javascript - - Raven.context(function() { - doSomething(a[0]) - }) - -``Raven.wrap`` wraps a function in a similar way to ``Raven.context``, but instead of executing the function, it returns another function. This is totally awesome for use when passing around a callback. - -.. code-block:: javascript - - var doIt = function() { - // doing cool stuff - } - - setTimeout(Raven.wrap(doIt), 1000) - -Tracking authenticated users -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -While a user is logged in, you can tell Sentry to associate errors with user data. - -.. code-block:: javascript - - Raven.setUserContext({ - email: 'matt@example.com', - id: '123' - }) - -If at any point, the user becomes unauthenticated, you can call ``Raven.setUserContext()`` with no arguments to remove their data. *This would only really be useful in a large web app where the user logs in/out without a page reload.* - -Capturing a specific message -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: javascript - - Raven.captureMessage('Broken!') - -Passing additional data -~~~~~~~~~~~~~~~~~~~~~~~ - -``captureException``, ``context``, ``wrap``, and ``captureMessage`` functions all allow passing additional data to be tagged onto the error, such as ``tags`` or ``extra`` for additional context. - -.. code-block:: javascript - - Raven.captureException(e, {tags: { key: "value" }}) - - Raven.captureMessage('Broken!', {tags: { key: "value" }}) - - Raven.context({tags: { key: "value" }}, function(){ ... }) - - Raven.wrap({logger: "my.module"}, function(){ ... }) - - Raven.captureException(e, {extra: { foo: "bar" }}) - -You can also set context variables globally to be merged in with future exceptions with ``setExtraContext`` and ``setTagsContext``. - -.. code-block:: javascript - - Raven.setExtraContext({ foo: "bar" }) - Raven.setTagsContext({ key: "value" }) - - -Getting back an event id -~~~~~~~~~~~~~~~~~~~~~~~~ - -An event id is a globally unique id for the event that was just sent. This event id can be used to find the exact event from within Sentry. - -This is often used to display for the user and report an error to customer service. - -.. code-block:: javascript - - Raven.lastEventId() - -``Raven.lastEventId()`` will be undefined until an event is sent. After an event is sent, it will contain the string id. - -.. code-block:: javascript - - Raven.captureMessage('Broken!') - alert(Raven.lastEventId()) - - -Check if Raven is setup and ready to go -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: javascript - - Raven.isSetup() - - -Dealing with minified source code -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Raven and Sentry now support `Source Maps `_. - -We have provided some instructions to creating Source Maps over at https://www.getsentry.com/docs/sourcemaps/. Also, checkout our `Gruntfile `_ for a good example of what we're doing. - -You can use `Source Map Validator `_ to help verify that things are correct. - -CORS -~~~~ - -If you're hosting your scripts on another domain and things don't get caught by Raven, it's likely that the error will bubble up to ``window.onerror``. If this happens, the error will report some ugly ``Script error`` and Raven will drop it on the floor -since this is a useless error for everybody. - -To help mitigate this, we can tell the browser that these scripts are safe and we're allowing them to expose their errors to us. - -In your `` - -And set an ``Access-Control-Allow-Origin`` HTTP header on that file. - -.. code-block:: console - - Access-Control-Allow-Origin: * - -**Note: both of these steps need to be done or your scripts might not even get executed** diff --git a/htdocs/includes/raven-js/example/Makefile b/htdocs/includes/raven-js/example/Makefile deleted file mode 100644 index 87976776e90..00000000000 --- a/htdocs/includes/raven-js/example/Makefile +++ /dev/null @@ -1,3 +0,0 @@ - -build: - ../node_modules/.bin/uglifyjs --source-map=file.sourcemap.js -c -o file.min.js file1.js file2.js diff --git a/htdocs/includes/raven-js/example/file.min.js b/htdocs/includes/raven-js/example/file.min.js deleted file mode 100644 index 12b9f811b28..00000000000 --- a/htdocs/includes/raven-js/example/file.min.js +++ /dev/null @@ -1,2 +0,0 @@ -function add(a,b){"use strict";return a+b}function multiply(a,b){"use strict";return a*b}function divide(a,b){"use strict";try{return multiply(add(a,b),a,b)/c}catch(e){Raven.captureException(e)}} -//@ sourceMappingURL=file.sourcemap.js \ No newline at end of file diff --git a/htdocs/includes/raven-js/example/file.sourcemap.js b/htdocs/includes/raven-js/example/file.sourcemap.js deleted file mode 100644 index 1bd0f6510cf..00000000000 --- a/htdocs/includes/raven-js/example/file.sourcemap.js +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"file.min.js","sources":["file1.js","file2.js"],"names":["add","a","b","multiply","divide","c","e","Raven","captureException"],"mappings":"AAAA,QAASA,KAAIC,EAAGC,GACf,YACA,OAAOD,GAAIC,ECFZ,QAASC,UAASF,EAAGC,GACpB,YACA,OAAOD,GAAIC,EAEZ,QAASE,QAAOH,EAAGC,GAClB,YACA,KACC,MAAOC,UAASH,IAAIC,EAAGC,GAAID,EAAGC,GAAKG,EAClC,MAAOC,GACRC,MAAMC,iBAAiBF"} \ No newline at end of file diff --git a/htdocs/includes/raven-js/example/file1.js b/htdocs/includes/raven-js/example/file1.js deleted file mode 100644 index eed5827852d..00000000000 --- a/htdocs/includes/raven-js/example/file1.js +++ /dev/null @@ -1,4 +0,0 @@ -function add(a, b) { - "use strict"; - return a + b; -} \ No newline at end of file diff --git a/htdocs/includes/raven-js/example/file2.js b/htdocs/includes/raven-js/example/file2.js deleted file mode 100644 index 8b174356846..00000000000 --- a/htdocs/includes/raven-js/example/file2.js +++ /dev/null @@ -1,12 +0,0 @@ -function multiply(a, b) { - "use strict"; - return a * b; -} -function divide(a, b) { - "use strict"; - try { - return multiply(add(a, b), a, b) / c; - } catch (e) { - Raven.captureException(e); - } -} diff --git a/htdocs/includes/raven-js/example/index.html b/htdocs/includes/raven-js/example/index.html deleted file mode 100644 index b7ebbdd018e..00000000000 --- a/htdocs/includes/raven-js/example/index.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - Scratch Disk - - - - - - - - - - - - - - - - - - diff --git a/htdocs/includes/raven-js/example/scratch.js b/htdocs/includes/raven-js/example/scratch.js deleted file mode 100644 index f1962bbdfc1..00000000000 --- a/htdocs/includes/raven-js/example/scratch.js +++ /dev/null @@ -1,42 +0,0 @@ -function foo() { - console.log("lol, i don't do anything") -} - -function foo2() { - foo() - console.log('i called foo') -} - -function broken() { - try { - /*fkjdsahfdhskfhdsahfudshafuoidashfudsa*/ fdasfds[0]; // i throw an error h sadhf hadsfdsakf kl;dsjaklf jdklsajfk ljds;klafldsl fkhdas;hf hdsaf hdsalfhjldksahfljkdsahfjkl dhsajkfl hdklsahflkjdsahkfj hdsjakhf dkashfl diusafh kdsjahfkldsahf jkdashfj khdasjkfhdjksahflkjdhsakfhjdksahfjkdhsakf hdajskhf kjdash kjfads fjkadsh jkfdsa jkfdas jkfdjkas hfjkdsajlk fdsajk fjkdsa fjdsa fdkjlsa fjkdaslk hfjlkdsah fhdsahfui - }catch(e) { - Raven.captureException(e); - } -} - -function ready() { - document.getElementById('test').onclick = broken; -} - -function foo3() { - document.getElementById('crap').value = 'barfdasjkfhoadshflkaosfjadiosfhdaskjfasfadsfads'; -} - -function somethingelse() { - document.getElementById('somethingelse').value = 'this is some realy really long message just so our minification is largeeeeeeeeee!'; -} - -function derp() { - fdas[0]; -} - -function testOptions() { - Raven.context({tags: {foo: 'bar'}}, function() { - throw new Error('foo'); - }); -} - -function throwString() { - throw 'oops'; -} diff --git a/htdocs/includes/raven-js/package.json b/htdocs/includes/raven-js/package.json deleted file mode 100644 index 9352edcab38..00000000000 --- a/htdocs/includes/raven-js/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "raven-js", - "version": "1.1.19", - "license": "BSD-2-Clause", - "homepage": "https://getsentry.com", - "scripts": { - "pretest": "npm install", - "test": "grunt test" - }, - "repository": { - "type": "git", - "url": "git://github.com/getsentry/raven-js.git" - }, - "main": "dist/raven.js", - "devDependencies": { - "chai": "~1.8.1", - "grunt": "~0.4.1", - "grunt-cli": "~0.1.9", - "grunt-contrib-jshint": "~0.6.3", - "grunt-contrib-uglify": "~0.2.2", - "grunt-contrib-concat": "~0.3.0", - "grunt-contrib-clean": "~0.4.0", - "grunt-mocha": "~0.4.1", - "grunt-release": "~0.6.0", - "grunt-s3": "~0.2.0-alpha.3", - "grunt-gitinfo": "~0.1.1", - "grunt-contrib-connect": "~0.5.0", - "grunt-contrib-copy": "~0.4.1", - "sinon": "~1.7.3", - "lodash": "~2.4.0" - } -} diff --git a/htdocs/includes/raven-js/plugins/angular.js b/htdocs/includes/raven-js/plugins/angular.js deleted file mode 100644 index 98bf5892001..00000000000 --- a/htdocs/includes/raven-js/plugins/angular.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Angular.js plugin - * - * Provides an $exceptionHandler for Angular.js - */ -;(function(Raven, angular) { -'use strict'; - -// quit if angular isn't on the page -if (!angular) { - return; -} - -function ngRavenProvider($provide) { - $provide.decorator('$exceptionHandler', [ - 'RavenConfig', '$delegate', - ngRavenExceptionHandler - ]); -} - -function ngRavenExceptionHandler(RavenConfig, $delegate) { - if (!RavenConfig) - throw new Error('RavenConfig must be set before using this'); - - Raven.config(RavenConfig.dsn, RavenConfig.config).install(); - return function angularExceptionHandler(ex, cause) { - $delegate(ex, cause); - Raven.captureException(ex, {extra: {cause: cause}}); - }; -} - -angular.module('ngRaven', []) - .config(['$provide', ngRavenProvider]) - .value('Raven', Raven); - -})(window.Raven, window.angular); diff --git a/htdocs/includes/raven-js/plugins/backbone.js b/htdocs/includes/raven-js/plugins/backbone.js deleted file mode 100644 index 09e0f6b8c1c..00000000000 --- a/htdocs/includes/raven-js/plugins/backbone.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Backbone.js plugin - * - * Patches Backbone.Events callbacks. - */ -;(function(window, Raven, Backbone) { -'use strict'; - -// quit if Backbone isn't on the page -if (!Backbone) { - return; -} - -function makeBackboneEventsOn(oldOn) { - return function BackboneEventsOn(name, callback, context) { - var wrapCallback = function (cb) { - if (Object.prototype.toString.call(cb) === '[object Function]') { - var _callback = cb._callback || cb; - cb = Raven.wrap(cb); - cb._callback = _callback; - } - return cb; - }; - if (Object.prototype.toString.call(name) === '[object Object]') { - // Handle event maps. - for (var key in name) { - if (name.hasOwnProperty(key)) { - name[key] = wrapCallback(name[key]); - } - } - } else { - callback = wrapCallback(callback); - } - return oldOn.call(this, name, callback, context); - }; -} - -// We're too late to catch all of these by simply patching Backbone.Events.on -var affectedObjects = [ - Backbone.Events, - Backbone, - Backbone.Model.prototype, - Backbone.Collection.prototype, - Backbone.View.prototype, - Backbone.Router.prototype, - Backbone.History.prototype -], i = 0, l = affectedObjects.length; - -for (; i < l; i++) { - var affected = affectedObjects[i]; - affected.on = makeBackboneEventsOn(affected.on); - affected.bind = affected.on; -} - -}(window, window.Raven, window.Backbone)); diff --git a/htdocs/includes/raven-js/plugins/console.js b/htdocs/includes/raven-js/plugins/console.js deleted file mode 100644 index 4d5ba94090f..00000000000 --- a/htdocs/includes/raven-js/plugins/console.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * console plugin - * - * Monkey patches console.* calls into Sentry messages with - * their appropriate log levels. (Experimental) - */ -;(function(window, Raven, console) { -'use strict'; - -var originalConsole = console, - logLevels = ['debug', 'info', 'warn', 'error'], - level = logLevels.pop(); - -var logForGivenLevel = function(level) { - var originalConsoleLevel = console[level]; - - // warning level is the only level that doesn't map up - // correctly with what Sentry expects. - if (level === 'warn') level = 'warning'; - return function () { - var args = [].slice.call(arguments); - Raven.captureMessage('' + args, {level: level, logger: 'console'}); - - // this fails for some browsers. :( - if (originalConsoleLevel) { - // IE9 doesn't allow calling apply on console functions directly - // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193 - Function.prototype.bind - .call(originalConsoleLevel, originalConsole) - .apply(originalConsole, args); - } - }; -}; - - -while(level) { - console[level] = logForGivenLevel(level); - level = logLevels.pop(); -} -// export -window.console = console; - -}(window, window.Raven, window.console || {})); diff --git a/htdocs/includes/raven-js/plugins/ember.js b/htdocs/includes/raven-js/plugins/ember.js deleted file mode 100644 index c6d0551c709..00000000000 --- a/htdocs/includes/raven-js/plugins/ember.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Ember.js plugin - * - * Patches event handler callbacks and ajax callbacks. - */ -;(function(window, Raven, Ember) { -'use strict'; - -// quit if Ember isn't on the page -if (!Ember) { - return; -} - -var _oldOnError = Ember.onerror; -Ember.onerror = function EmberOnError(error) { - Raven.captureException(error); - if (typeof _oldOnError === 'function') { - _oldOnError.call(this, error); - } -}; -Ember.RSVP.on('error', function (reason) { - if (reason instanceof Error) { - Raven.captureException(reason, {extra: {context: 'Unhandled Promise error detected'}}); - } else { - Raven.captureMessage('Unhandled Promise error detected', {extra: {reason: reason}}); - } -}); - -}(window, window.Raven, window.Ember)); diff --git a/htdocs/includes/raven-js/plugins/jquery.js b/htdocs/includes/raven-js/plugins/jquery.js deleted file mode 100644 index 4a5474cdb86..00000000000 --- a/htdocs/includes/raven-js/plugins/jquery.js +++ /dev/null @@ -1,75 +0,0 @@ -/** - * jQuery plugin - * - * Patches event handler callbacks and ajax callbacks. - */ -;(function(window, Raven, $) { -'use strict'; - -// quit if jQuery isn't on the page -if (!$) { - return; -} - -var _oldEventAdd = $.event.add; -$.event.add = function ravenEventAdd(elem, types, handler, data, selector) { - var _handler; - - if (handler && handler.handler) { - _handler = handler.handler; - handler.handler = Raven.wrap(handler.handler); - } else { - _handler = handler; - handler = Raven.wrap(handler); - } - - // If the handler we are attaching doesn’t have the same guid as - // the original, it will never be removed when someone tries to - // unbind the original function later. Technically as a result of - // this our guids are no longer globally unique, but whatever, that - // never hurt anybody RIGHT?! - if (_handler.guid) { - handler.guid = _handler.guid; - } else { - handler.guid = _handler.guid = $.guid++; - } - - return _oldEventAdd.call(this, elem, types, handler, data, selector); -}; - -var _oldReady = $.fn.ready; -$.fn.ready = function ravenjQueryReadyWrapper(fn) { - return _oldReady.call(this, Raven.wrap(fn)); -}; - -var _oldAjax = $.ajax; -$.ajax = function ravenAjaxWrapper(url, options) { - var keys = ['complete', 'error', 'success'], key; - - // Taken from https://github.com/jquery/jquery/blob/eee2eaf1d7a189d99106423a4206c224ebd5b848/src/ajax.js#L311-L318 - // If url is an object, simulate pre-1.5 signature - if (typeof url === 'object') { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - /*jshint -W084*/ - while(key = keys.pop()) { - if ($.isFunction(options[key])) { - options[key] = Raven.wrap(options[key]); - } - } - /*jshint +W084*/ - - try { - return _oldAjax.call(this, url, options); - } catch (e) { - Raven.captureException(e); - throw e; - } -}; - -}(window, window.Raven, window.jQuery)); diff --git a/htdocs/includes/raven-js/plugins/native.js b/htdocs/includes/raven-js/plugins/native.js deleted file mode 100644 index c641f13a5d1..00000000000 --- a/htdocs/includes/raven-js/plugins/native.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * native plugin - * - * Extends support for global error handling for asynchronous browser - * functions. Adopted from Closure Library's errorhandler.js. - */ -;(function extendToAsynchronousCallbacks(window, Raven) { -"use strict"; - -var _helper = function _helper(fnName) { - var originalFn = window[fnName]; - window[fnName] = function ravenAsyncExtension() { - // Make a copy of the arguments - var args = [].slice.call(arguments); - var originalCallback = args[0]; - if (typeof (originalCallback) === 'function') { - args[0] = Raven.wrap(originalCallback); - } - // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it - // also supports only two arguments and doesn't care what this is, so we - // can just call the original function directly. - if (originalFn.apply) { - return originalFn.apply(this, args); - } else { - return originalFn(args[0], args[1]); - } - }; -}; - -_helper('setTimeout'); -_helper('setInterval'); - -}(window, window.Raven)); diff --git a/htdocs/includes/raven-js/plugins/require.js b/htdocs/includes/raven-js/plugins/require.js deleted file mode 100644 index 60378a1b0b9..00000000000 --- a/htdocs/includes/raven-js/plugins/require.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * require.js plugin - * - * Automatically wrap define/require callbacks. (Experimental) - */ -;(function(window, Raven) { -'use strict'; - -if (typeof define === 'function' && define.amd) { - window.define = Raven.wrap({deep: false}, define); - window.require = Raven.wrap({deep: false}, require); -} - -}(window, window.Raven)); diff --git a/htdocs/includes/raven-js/src/raven.js b/htdocs/includes/raven-js/src/raven.js deleted file mode 100644 index a2d2b35604b..00000000000 --- a/htdocs/includes/raven-js/src/raven.js +++ /dev/null @@ -1,830 +0,0 @@ -'use strict'; - -// First, check for JSON support -// If there is no JSON, we no-op the core features of Raven -// since JSON is required to encode the payload -var _Raven = window.Raven, - hasJSON = !!(typeof JSON === 'object' && JSON.stringify), - lastCapturedException, - lastEventId, - globalServer, - globalUser, - globalKey, - globalProject, - globalOptions = { - logger: 'javascript', - ignoreErrors: [], - ignoreUrls: [], - whitelistUrls: [], - includePaths: [], - collectWindowErrors: true, - tags: {}, - maxMessageLength: 100, - extra: {} - }, - authQueryString, - isRavenInstalled = false, - - objectPrototype = Object.prototype, - startTime = now(); - -/* - * The core Raven singleton - * - * @this {Raven} - */ -var Raven = { - VERSION: '<%= pkg.version %>', - - debug: true, - - /* - * Allow multiple versions of Raven to be installed. - * Strip Raven from the global context and returns the instance. - * - * @return {Raven} - */ - noConflict: function() { - window.Raven = _Raven; - return Raven; - }, - - /* - * Configure Raven with a DSN and extra options - * - * @param {string} dsn The public Sentry DSN - * @param {object} options Optional set of of global options [optional] - * @return {Raven} - */ - config: function(dsn, options) { - if (globalServer) { - logDebug('error', 'Error: Raven has already been configured'); - return Raven; - } - if (!dsn) return Raven; - - var uri = parseDSN(dsn), - lastSlash = uri.path.lastIndexOf('/'), - path = uri.path.substr(1, lastSlash); - - // merge in options - if (options) { - each(options, function(key, value){ - globalOptions[key] = value; - }); - } - - // "Script error." is hard coded into browsers for errors that it can't read. - // this is the result of a script being pulled in from an external domain and CORS. - globalOptions.ignoreErrors.push(/^Script error\.?$/); - globalOptions.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/); - - // join regexp rules into one big rule - globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors); - globalOptions.ignoreUrls = globalOptions.ignoreUrls.length ? joinRegExp(globalOptions.ignoreUrls) : false; - globalOptions.whitelistUrls = globalOptions.whitelistUrls.length ? joinRegExp(globalOptions.whitelistUrls) : false; - globalOptions.includePaths = joinRegExp(globalOptions.includePaths); - - globalKey = uri.user; - globalProject = uri.path.substr(lastSlash + 1); - - // assemble the endpoint from the uri pieces - globalServer = '//' + uri.host + - (uri.port ? ':' + uri.port : '') + - '/' + path + 'api/' + globalProject + '/store/'; - - if (uri.protocol) { - globalServer = uri.protocol + ':' + globalServer; - } - - if (globalOptions.fetchContext) { - TraceKit.remoteFetching = true; - } - - if (globalOptions.linesOfContext) { - TraceKit.linesOfContext = globalOptions.linesOfContext; - } - - TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors; - - setAuthQueryString(); - - // return for chaining - return Raven; - }, - - /* - * Installs a global window.onerror error handler - * to capture and report uncaught exceptions. - * At this point, install() is required to be called due - * to the way TraceKit is set up. - * - * @return {Raven} - */ - install: function() { - if (isSetup() && !isRavenInstalled) { - TraceKit.report.subscribe(handleStackInfo); - isRavenInstalled = true; - } - - return Raven; - }, - - /* - * Wrap code within a context so Raven can capture errors - * reliably across domains that is executed immediately. - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The callback to be immediately executed within the context - * @param {array} args An array of arguments to be called with the callback [optional] - */ - context: function(options, func, args) { - if (isFunction(options)) { - args = func || []; - func = options; - options = undefined; - } - - return Raven.wrap(options, func).apply(this, args); - }, - - /* - * Wrap code within a context and returns back a new function to be executed - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The function to be wrapped in a new context - * @return {function} The newly wrapped functions with a context - */ - wrap: function(options, func) { - // 1 argument has been passed, and it's not a function - // so just return it - if (isUndefined(func) && !isFunction(options)) { - return options; - } - - // options is optional - if (isFunction(options)) { - func = options; - options = undefined; - } - - // At this point, we've passed along 2 arguments, and the second one - // is not a function either, so we'll just return the second argument. - if (!isFunction(func)) { - return func; - } - - // We don't wanna wrap it twice! - if (func.__raven__) { - return func; - } - - function wrapped() { - var args = [], i = arguments.length, - deep = !options || options && options.deep !== false; - // Recursively wrap all of a function's arguments that are - // functions themselves. - - while(i--) args[i] = deep ? Raven.wrap(options, arguments[i]) : arguments[i]; - - try { - /*jshint -W040*/ - return func.apply(this, args); - } catch(e) { - Raven.captureException(e, options); - throw e; - } - } - - // copy over properties of the old function - for (var property in func) { - if (hasKey(func, property)) { - wrapped[property] = func[property]; - } - } - - // Signal that this function has been wrapped already - // for both debugging and to prevent it to being wrapped twice - wrapped.__raven__ = true; - wrapped.__inner__ = func; - - return wrapped; - }, - - /* - * Uninstalls the global error handler. - * - * @return {Raven} - */ - uninstall: function() { - TraceKit.report.uninstall(); - isRavenInstalled = false; - - return Raven; - }, - - /* - * Manually capture an exception and send it over to Sentry - * - * @param {error} ex An exception to be logged - * @param {object} options A specific set of options for this error [optional] - * @return {Raven} - */ - captureException: function(ex, options) { - // If not an Error is passed through, recall as a message instead - if (!isError(ex)) return Raven.captureMessage(ex, options); - - // Store the raw exception object for potential debugging and introspection - lastCapturedException = ex; - - // TraceKit.report will re-raise any exception passed to it, - // which means you have to wrap it in try/catch. Instead, we - // can wrap it here and only re-raise if TraceKit.report - // raises an exception different from the one we asked to - // report on. - try { - TraceKit.report(ex, options); - } catch(ex1) { - if(ex !== ex1) { - throw ex1; - } - } - - return Raven; - }, - - /* - * Manually send a message to Sentry - * - * @param {string} msg A plain message to be captured in Sentry - * @param {object} options A specific set of options for this message [optional] - * @return {Raven} - */ - captureMessage: function(msg, options) { - // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an - // early call; we'll error on the side of logging anything called before configuration since it's - // probably something you should see: - if (!!globalOptions.ignoreErrors.test && globalOptions.ignoreErrors.test(msg)) { - return; - } - - // Fire away! - send( - objectMerge({ - message: msg + '' // Make sure it's actually a string - }, options) - ); - - return Raven; - }, - - /* - * Set/clear a user to be sent along with the payload. - * - * @param {object} user An object representing user data [optional] - * @return {Raven} - */ - setUserContext: function(user) { - globalUser = user; - - return Raven; - }, - - /* - * Set extra attributes to be sent along with the payload. - * - * @param {object} extra An object representing extra data [optional] - * @return {Raven} - */ - setExtraContext: function(extra) { - globalOptions.extra = extra || {}; - - return Raven; - }, - - /* - * Set tags to be sent along with the payload. - * - * @param {object} tags An object representing tags [optional] - * @return {Raven} - */ - setTagsContext: function(tags) { - globalOptions.tags = tags || {}; - - return Raven; - }, - - /* - * Set release version of application - * - * @param {string} release Typically something like a git SHA to identify version - * @return {Raven} - */ - setReleaseContext: function(release) { - globalOptions.release = release; - - return Raven; - }, - - /* - * Set the dataCallback option - * - * @param {function} callback The callback to run which allows the - * data blob to be mutated before sending - * @return {Raven} - */ - setDataCallback: function(callback) { - globalOptions.dataCallback = callback; - - return Raven; - }, - - /* - * Set the shouldSendCallback option - * - * @param {function} callback The callback to run which allows - * introspecting the blob before sending - * @return {Raven} - */ - setShouldSendCallback: function(callback) { - globalOptions.shouldSendCallback = callback; - - return Raven; - }, - - /* - * Get the latest raw exception that was captured by Raven. - * - * @return {error} - */ - lastException: function() { - return lastCapturedException; - }, - - /* - * Get the last event id - * - * @return {string} - */ - lastEventId: function() { - return lastEventId; - }, - - /* - * Determine if Raven is setup and ready to go. - * - * @return {boolean} - */ - isSetup: function() { - return isSetup(); - } -}; - -Raven.setUser = Raven.setUserContext; // To be deprecated - -function triggerEvent(eventType, options) { - var event, key; - - options = options || {}; - - eventType = 'raven' + eventType.substr(0,1).toUpperCase() + eventType.substr(1); - - if (document.createEvent) { - event = document.createEvent('HTMLEvents'); - event.initEvent(eventType, true, true); - } else { - event = document.createEventObject(); - event.eventType = eventType; - } - - for (key in options) if (hasKey(options, key)) { - event[key] = options[key]; - } - - if (document.createEvent) { - // IE9 if standards - document.dispatchEvent(event); - } else { - // IE8 regardless of Quirks or Standards - // IE9 if quirks - try { - document.fireEvent('on' + event.eventType.toLowerCase(), event); - } catch(e) {} - } -} - -var dsnKeys = 'source protocol user pass host port path'.split(' '), - dsnPattern = /^(?:(\w+):)?\/\/(\w+)(:\w+)?@([\w\.-]+)(?::(\d+))?(\/.*)/; - -function RavenConfigError(message) { - this.name = 'RavenConfigError'; - this.message = message; -} -RavenConfigError.prototype = new Error(); -RavenConfigError.prototype.constructor = RavenConfigError; - -/**** Private functions ****/ -function parseDSN(str) { - var m = dsnPattern.exec(str), - dsn = {}, - i = 7; - - try { - while (i--) dsn[dsnKeys[i]] = m[i] || ''; - } catch(e) { - throw new RavenConfigError('Invalid DSN: ' + str); - } - - if (dsn.pass) - throw new RavenConfigError('Do not specify your private key in the DSN!'); - - return dsn; -} - -function isUndefined(what) { - return what === void 0; -} - -function isFunction(what) { - return typeof what === 'function'; -} - -function isString(what) { - return objectPrototype.toString.call(what) === '[object String]'; -} - -function isObject(what) { - return typeof what === 'object' && what !== null; -} - -function isEmptyObject(what) { - for (var k in what) return false; - return true; -} - -// Sorta yanked from https://github.com/joyent/node/blob/aa3b4b4/lib/util.js#L560 -// with some tiny modifications -function isError(what) { - return isObject(what) && - objectPrototype.toString.call(what) === '[object Error]' || - what instanceof Error; -} - -/** - * hasKey, a better form of hasOwnProperty - * Example: hasKey(MainHostObject, property) === true/false - * - * @param {Object} host object to check property - * @param {string} key to check - */ -function hasKey(object, key) { - return objectPrototype.hasOwnProperty.call(object, key); -} - -function each(obj, callback) { - var i, j; - - if (isUndefined(obj.length)) { - for (i in obj) { - if (hasKey(obj, i)) { - callback.call(null, i, obj[i]); - } - } - } else { - j = obj.length; - if (j) { - for (i = 0; i < j; i++) { - callback.call(null, i, obj[i]); - } - } - } -} - - -function setAuthQueryString() { - authQueryString = - '?sentry_version=4' + - '&sentry_client=raven-js/' + Raven.VERSION + - '&sentry_key=' + globalKey; -} - - -function handleStackInfo(stackInfo, options) { - var frames = []; - - if (stackInfo.stack && stackInfo.stack.length) { - each(stackInfo.stack, function(i, stack) { - var frame = normalizeFrame(stack); - if (frame) { - frames.push(frame); - } - }); - } - - triggerEvent('handle', { - stackInfo: stackInfo, - options: options - }); - - processException( - stackInfo.name, - stackInfo.message, - stackInfo.url, - stackInfo.lineno, - frames, - options - ); -} - -function normalizeFrame(frame) { - if (!frame.url) return; - - // normalize the frames data - var normalized = { - filename: frame.url, - lineno: frame.line, - colno: frame.column, - 'function': frame.func || '?' - }, context = extractContextFromFrame(frame), i; - - if (context) { - var keys = ['pre_context', 'context_line', 'post_context']; - i = 3; - while (i--) normalized[keys[i]] = context[i]; - } - - normalized.in_app = !( // determine if an exception came from outside of our app - // first we check the global includePaths list. - !globalOptions.includePaths.test(normalized.filename) || - // Now we check for fun, if the function name is Raven or TraceKit - /(Raven|TraceKit)\./.test(normalized['function']) || - // finally, we do a last ditch effort and check for raven.min.js - /raven\.(min\.)?js$/.test(normalized.filename) - ); - - return normalized; -} - -function extractContextFromFrame(frame) { - // immediately check if we should even attempt to parse a context - if (!frame.context || !globalOptions.fetchContext) return; - - var context = frame.context, - pivot = ~~(context.length / 2), - i = context.length, isMinified = false; - - while (i--) { - // We're making a guess to see if the source is minified or not. - // To do that, we make the assumption if *any* of the lines passed - // in are greater than 300 characters long, we bail. - // Sentry will see that there isn't a context - if (context[i].length > 300) { - isMinified = true; - break; - } - } - - if (isMinified) { - // The source is minified and we don't know which column. Fuck it. - if (isUndefined(frame.column)) return; - - // If the source is minified and has a frame column - // we take a chunk of the offending line to hopefully shed some light - return [ - [], // no pre_context - context[pivot].substr(frame.column, 50), // grab 50 characters, starting at the offending column - [] // no post_context - ]; - } - - return [ - context.slice(0, pivot), // pre_context - context[pivot], // context_line - context.slice(pivot + 1) // post_context - ]; -} - -function processException(type, message, fileurl, lineno, frames, options) { - var stacktrace, label, i; - - // In some instances message is not actually a string, no idea why, - // so we want to always coerce it to one. - message += ''; - - // Sometimes an exception is getting logged in Sentry as - // - // This can only mean that the message was falsey since this value - // is hardcoded into Sentry itself. - // At this point, if the message is falsey, we bail since it's useless - if (type === 'Error' && !message) return; - - if (globalOptions.ignoreErrors.test(message)) return; - - if (frames && frames.length) { - fileurl = frames[0].filename || fileurl; - // Sentry expects frames oldest to newest - // and JS sends them as newest to oldest - frames.reverse(); - stacktrace = {frames: frames}; - } else if (fileurl) { - stacktrace = { - frames: [{ - filename: fileurl, - lineno: lineno, - in_app: true - }] - }; - } - - // Truncate the message to a max of characters - message = truncate(message, globalOptions.maxMessageLength); - - if (globalOptions.ignoreUrls && globalOptions.ignoreUrls.test(fileurl)) return; - if (globalOptions.whitelistUrls && !globalOptions.whitelistUrls.test(fileurl)) return; - - label = lineno ? message + ' at ' + lineno : message; - - // Fire away! - send( - objectMerge({ - // sentry.interfaces.Exception - exception: { - type: type, - value: message - }, - // sentry.interfaces.Stacktrace - stacktrace: stacktrace, - culprit: fileurl, - message: label - }, options) - ); -} - -function objectMerge(obj1, obj2) { - if (!obj2) { - return obj1; - } - each(obj2, function(key, value){ - obj1[key] = value; - }); - return obj1; -} - -function truncate(str, max) { - return str.length <= max ? str : str.substr(0, max) + '\u2026'; -} - -function now() { - return +new Date(); -} - -function getHttpData() { - var http = { - url: document.location.href, - headers: { - 'User-Agent': navigator.userAgent - } - }; - - if (document.referrer) { - http.headers.Referer = document.referrer; - } - - return http; -} - -function send(data) { - if (!isSetup()) return; - - data = objectMerge({ - project: globalProject, - logger: globalOptions.logger, - platform: 'javascript', - // sentry.interfaces.Http - request: getHttpData() - }, data); - - // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge - data.tags = objectMerge(objectMerge({}, globalOptions.tags), data.tags); - data.extra = objectMerge(objectMerge({}, globalOptions.extra), data.extra); - - // Send along our own collected metadata with extra - data.extra = objectMerge({ - 'session:duration': now() - startTime - }, data.extra); - - // If there are no tags/extra, strip the key from the payload alltogther. - if (isEmptyObject(data.tags)) delete data.tags; - - if (globalUser) { - // sentry.interfaces.User - data.user = globalUser; - } - - // Include the release iff it's defined in globalOptions - if (globalOptions.release) data.release = globalOptions.release; - - if (isFunction(globalOptions.dataCallback)) { - data = globalOptions.dataCallback(data) || data; - } - - // Why?????????? - if (!data || isEmptyObject(data)) { - return; - } - - // Check if the request should be filtered or not - if (isFunction(globalOptions.shouldSendCallback) && !globalOptions.shouldSendCallback(data)) { - return; - } - - // Send along an event_id if not explicitly passed. - // This event_id can be used to reference the error within Sentry itself. - // Set lastEventId after we know the error should actually be sent - lastEventId = data.event_id || (data.event_id = uuid4()); - - makeRequest(data); -} - - -function makeRequest(data) { - var img = newImage(), - src = globalServer + authQueryString + '&sentry_data=' + encodeURIComponent(JSON.stringify(data)); - - img.crossOrigin = 'anonymous'; - img.onload = function success() { - triggerEvent('success', { - data: data, - src: src - }); - }; - img.onerror = img.onabort = function failure() { - triggerEvent('failure', { - data: data, - src: src - }); - }; - img.src = src; -} - -// Note: this is shitty, but I can't figure out how to get -// sinon to stub document.createElement without breaking everything -// so this wrapper is just so I can stub it for tests. -function newImage() { - return document.createElement('img'); -} - -function isSetup() { - if (!hasJSON) return false; // needs JSON support - if (!globalServer) { - logDebug('error', 'Error: Raven has not been configured.'); - return false; - } - return true; -} - -function joinRegExp(patterns) { - // Combine an array of regular expressions and strings into one large regexp - // Be mad. - var sources = [], - i = 0, len = patterns.length, - pattern; - - for (; i < len; i++) { - pattern = patterns[i]; - if (isString(pattern)) { - // If it's a string, we need to escape it - // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions - sources.push(pattern.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1")); - } else if (pattern && pattern.source) { - // If it's a regexp already, we want to extract the source - sources.push(pattern.source); - } - // Intentionally skip other cases - } - return new RegExp(sources.join('|'), 'i'); -} - -// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 -function uuid4() { - return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = Math.random()*16|0, - v = c == 'x' ? r : (r&0x3|0x8); - return v.toString(16); - }); -} - -function logDebug(level, message) { - if (window.console && console[level] && Raven.debug) { - console[level](message); - } -} - -function afterLoad() { - // Attempt to initialize Raven on load - var RavenConfig = window.RavenConfig; - if (RavenConfig) { - Raven.config(RavenConfig.dsn, RavenConfig.config).install(); - } -} -afterLoad(); diff --git a/htdocs/includes/raven-js/template/_copyright.js b/htdocs/includes/raven-js/template/_copyright.js deleted file mode 100644 index f1ee87084f8..00000000000 --- a/htdocs/includes/raven-js/template/_copyright.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! Raven.js <%= pkg.release %> (<%= gitinfo.local.branch.current.shortSHA %>) | github.com/getsentry/raven-js */ - -/* - * Includes TraceKit - * https://github.com/getsentry/TraceKit - * - * Copyright <%= grunt.template.today('yyyy') %> Matt Robenolt and other contributors - * Released under the BSD license - * https://github.com/getsentry/raven-js/blob/master/LICENSE - * - */ diff --git a/htdocs/includes/raven-js/template/_footer.js b/htdocs/includes/raven-js/template/_footer.js deleted file mode 100644 index 9d102d2458d..00000000000 --- a/htdocs/includes/raven-js/template/_footer.js +++ /dev/null @@ -1,19 +0,0 @@ -// Expose Raven to the world -if (typeof define === 'function' && define.amd) { - // AMD - window.Raven = Raven; - define('raven', [], function() { - return Raven; - }); -} else if (typeof module === 'object') { - // browserify - module.exports = Raven; -} else if (typeof exports === 'object') { - // CommonJS - exports = Raven; -} else { - // Everything else - window.Raven = Raven; -} - -})(typeof window !== 'undefined' ? window : this); diff --git a/htdocs/includes/raven-js/template/_header.js b/htdocs/includes/raven-js/template/_header.js deleted file mode 100644 index 27595a61a2d..00000000000 --- a/htdocs/includes/raven-js/template/_header.js +++ /dev/null @@ -1,2 +0,0 @@ -;(function(window, undefined){ -'use strict'; diff --git a/htdocs/includes/raven-js/test/index.html b/htdocs/includes/raven-js/test/index.html deleted file mode 100644 index b5188ed0600..00000000000 --- a/htdocs/includes/raven-js/test/index.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - Raven.js Test Suite - - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/htdocs/includes/raven-js/test/raven.test.js b/htdocs/includes/raven-js/test/raven.test.js deleted file mode 100644 index e26a36ef174..00000000000 --- a/htdocs/includes/raven-js/test/raven.test.js +++ /dev/null @@ -1,1773 +0,0 @@ -function flushRavenState() { - authQueryString = undefined; - hasJSON = !isUndefined(window.JSON); - lastCapturedException = undefined; - lastEventId = undefined; - globalServer = undefined; - globalUser = undefined; - globalProject = undefined; - globalOptions = { - logger: 'javascript', - release: undefined, - ignoreErrors: [], - ignoreUrls: [], - whitelistUrls: [], - includePaths: [], - collectWindowErrors: true, - maxMessageLength: 100, - tags: {}, - extra: {} - }, - startTime = 0 - ; - - Raven.uninstall(); -} - -// window.console must be stubbed in for browsers that don't have it -if (typeof window.console === 'undefined') { - console = {error: function(){}}; -} - -var SENTRY_DSN = 'http://abc@example.com:80/2'; - -function setupRaven() { - Raven.config(SENTRY_DSN); -} - -// patched to return a predictable result -function uuid4() { - return 'abc123'; -} - -// patched to be predictable -function now() { - return 100; -} - -describe('TraceKit', function(){ - describe('stacktrace info', function() { - it('should not remove anonymous functions from the stack', function() { - // mock up an error object with a stack trace that includes both - // named functions and anonymous functions - var stack_str = "" + - " Error: \n" + - " at new (http://example.com/js/test.js:63)\n" + // stack[0] - " at namedFunc0 (http://example.com/js/script.js:10)\n" + // stack[1] - " at http://example.com/js/test.js:65\n" + // stack[2] - " at namedFunc2 (http://example.com/js/script.js:20)\n" + // stack[3] - " at http://example.com/js/test.js:67\n" + // stack[4] - " at namedFunc4 (http://example.com/js/script.js:100001)"; // stack[5] - var mock_err = { stack: stack_str }; - var trace = TraceKit.computeStackTrace.computeStackTraceFromStackProp(mock_err); - - // Make sure TraceKit didn't remove the anonymous functions - // from the stack like it used to :) - assert.equal(trace.stack[0].func, 'new '); - assert.equal(trace.stack[1].func, 'namedFunc0'); - assert.equal(trace.stack[2].func, '?'); - assert.equal(trace.stack[3].func, 'namedFunc2'); - assert.equal(trace.stack[4].func, '?'); - assert.equal(trace.stack[5].func, 'namedFunc4'); - }); - }); - describe('error notifications', function(){ - var testMessage = "__mocha_ignore__"; - var subscriptionHandler; - // TraceKit waits 2000ms for window.onerror to fire, so give the tests - // some extra time. - this.timeout(3000); - - before(function() { - // Prevent the onerror call that's part of our tests from getting to - // mocha's handler, which would treat it as a test failure. - // - // We set this up here and don't ever restore the old handler, because - // we can't do that without clobbering TraceKit's handler, which can only - // be installed once. - var oldOnError = window.onerror; - window.onerror = function(message) { - if (message == testMessage) { - return true; - } - return oldOnError.apply(this, arguments); - }; - }); - - afterEach(function() { - if (subscriptionHandler) { - TraceKit.report.unsubscribe(subscriptionHandler); - subscriptionHandler = null; - } - }); - - function testErrorNotification(collectWindowErrors, callOnError, numReports, done) { - var extraVal = "foo"; - var numDone = 0; - // TraceKit's collectWindowErrors flag shouldn't affect direct calls - // to TraceKit.report, so we parameterize it for the tests. - TraceKit.collectWindowErrors = collectWindowErrors; - - subscriptionHandler = function(stackInfo, extra) { - assert.equal(extra, extraVal); - numDone++; - if (numDone == numReports) { - done(); - } - }; - TraceKit.report.subscribe(subscriptionHandler); - - // TraceKit.report always throws an exception in order to trigger - // window.onerror so it can gather more stack data. Mocha treats - // uncaught exceptions as errors, so we catch it via assert.throws - // here (and manually call window.onerror later if appropriate). - // - // We test multiple reports because TraceKit has special logic for when - // report() is called a second time before either a timeout elapses or - // window.onerror is called (which is why we always call window.onerror - // only once below, after all calls to report()). - for (var i=0; i < numReports; i++) { - var e = new Error('testing'); - assert.throws(function() { - TraceKit.report(e, extraVal); - }, e); - } - // The call to report should work whether or not window.onerror is - // triggered, so we parameterize it for the tests. We only call it - // once, regardless of numReports, because the case we want to test for - // multiple reports is when window.onerror is *not* called between them. - if (callOnError) { - window.onerror(testMessage); - } - } - - Mocha.utils.forEach([false, true], function(collectWindowErrors) { - Mocha.utils.forEach([false, true], function(callOnError) { - Mocha.utils.forEach([1, 2], function(numReports) { - it('it should receive arguments from report() when' + - ' collectWindowErrors is ' + collectWindowErrors + - ' and callOnError is ' + callOnError + - ' and numReports is ' + numReports, function(done) { - testErrorNotification(collectWindowErrors, callOnError, numReports, done); - }); - }); - }); - }); - }); -}); - -describe('globals', function() { - beforeEach(function() { - setupRaven(); - globalOptions.fetchContext = true; - }); - - afterEach(function() { - flushRavenState(); - }); - - describe('getHttpData', function() { - var data = getHttpData(); - - it('should have a url', function() { - assert.equal(data.url, window.location.href); - }); - - it('should have the user-agent header', function() { - assert.equal(data.headers['User-Agent'], navigator.userAgent); - }); - - it('should have referer header when available', function() { - // lol this test is awful - if (window.document.referrer) { - assert.equal(data.headers.Referer, window.document.referrer); - } else { - assert.isUndefined(data.headers.Referer); - } - }); - - }); - - describe('isUndefined', function() { - it('should do as advertised', function() { - assert.isTrue(isUndefined()); - assert.isFalse(isUndefined({})); - assert.isFalse(isUndefined('')); - assert.isTrue(isUndefined(undefined)); - }); - }); - - describe('isFunction', function() { - it('should do as advertised', function() { - assert.isTrue(isFunction(function(){})); - assert.isFalse(isFunction({})); - assert.isFalse(isFunction('')); - assert.isFalse(isFunction(undefined)); - }); - }); - - describe('isString', function() { - it('should do as advertised', function() { - assert.isTrue(isString('')); - assert.isTrue(isString(String(''))); - assert.isTrue(isString(new String(''))); - assert.isFalse(isString({})); - assert.isFalse(isString(undefined)); - assert.isFalse(isString(function(){})); - }); - }); - - describe('isObject', function() { - it('should do as advertised', function() { - assert.isTrue(isObject({})); - assert.isTrue(isObject(new Error())) - assert.isFalse(isObject('')); - }); - }); - - describe('isEmptyObject', function() { - it('should work as advertised', function() { - assert.isTrue(isEmptyObject({})); - assert.isFalse(isEmptyObject({foo: 1})); - }); - }); - - describe('isError', function() { - it('should work as advertised', function() { - assert.isTrue(isError(new Error())); - assert.isTrue(isError(new ReferenceError())); - assert.isTrue(isError(new RavenConfigError())); - assert.isFalse(isError({})); - assert.isFalse(isError('')); - assert.isFalse(isError(true)); - }); - }); - - describe('objectMerge', function() { - it('should work as advertised', function() { - assert.deepEqual(objectMerge({}, {}), {}); - assert.deepEqual(objectMerge({a:1}, {b:2}), {a:1, b:2}); - assert.deepEqual(objectMerge({a:1}), {a:1}); - }); - }); - - describe('truncate', function() { - it('should work as advertised', function() { - assert.equal(truncate('lolol', 3), 'lol\u2026'); - assert.equal(truncate('lolol', 10), 'lolol'); - assert.equal(truncate('lol', 3), 'lol'); - }); - }); - - describe('isSetup', function() { - it('should return false with no JSON support', function() { - globalServer = 'http://localhost/'; - hasJSON = false; - assert.isFalse(isSetup()); - }); - - it('should return false when Raven is not configured', function() { - hasJSON = true; // be explicit - globalServer = undefined; - this.sinon.stub(window, 'logDebug'); - assert.isFalse(isSetup()); - }); - - it('should return true when everything is all gravy', function() { - hasJSON = true; - assert.isTrue(isSetup()); - }); - }); - - describe('logDebug', function() { - var level = 'error', - message = 'foobar'; - - it('should not write to console when Raven.debug is false', function() { - Raven.debug = false; - this.sinon.stub(console, level); - logDebug(level, message); - assert.isFalse(console[level].called); - }); - - it('should write to console when Raven.debug is true', function() { - Raven.debug = true; - this.sinon.stub(console, level); - logDebug(level, message); - assert.isTrue(console[level].calledOnce); - }); - }); - - describe('setAuthQueryString', function() { - it('should return a properly formatted string and cache it', function() { - var expected = '?sentry_version=4&sentry_client=raven-js/<%= pkg.version %>&sentry_key=abc'; - setAuthQueryString(); - assert.strictEqual(authQueryString, expected); - }); - }); - - describe('parseDSN', function() { - it('should do what it advertises', function() { - var pieces = parseDSN('http://abc@example.com:80/2'); - assert.strictEqual(pieces.protocol, 'http'); - assert.strictEqual(pieces.user, 'abc'); - assert.strictEqual(pieces.port, '80'); - assert.strictEqual(pieces.path, '/2'); - assert.strictEqual(pieces.host, 'example.com'); - }); - - it('should parse protocol relative', function() { - var pieces = parseDSN('//user@mattrobenolt.com/'); - assert.strictEqual(pieces.protocol, ''); - assert.strictEqual(pieces.user, 'user'); - assert.strictEqual(pieces.port, ''); - assert.strictEqual(pieces.path, '/'); - assert.strictEqual(pieces.host, 'mattrobenolt.com'); - }); - - it('should parse domain with hyphen', function() { - var pieces = parseDSN('http://user@matt-robenolt.com/1'); - assert.strictEqual(pieces.protocol, 'http'); - assert.strictEqual(pieces.user, 'user'); - assert.strictEqual(pieces.port, ''); - assert.strictEqual(pieces.path, '/1'); - assert.strictEqual(pieces.host, 'matt-robenolt.com'); - }); - - it('should raise a RavenConfigError when setting a password', function() { - try { - parseDSN('http://user:pass@example.com/2'); - } catch(e) { - return assert.equal(e.name, 'RavenConfigError'); - } - // shouldn't hit this - assert.isTrue(false); - }); - - it('should raise a RavenConfigError with an invalid DSN', function() { - try { - parseDSN('lol'); - } catch(e) { - return assert.equal(e.name, 'RavenConfigError'); - } - // shouldn't hit this - assert.isTrue(false); - }); - }); - - describe('normalizeFrame', function() { - it('should handle a normal frame', function() { - var context = [ - ['line1'], // pre - 'line2', // culprit - ['line3'] // post - ]; - this.sinon.stub(window, 'extractContextFromFrame').returns(context); - var frame = { - url: 'http://example.com/path/file.js', - line: 10, - column: 11, - func: 'lol' - // context: [] context is stubbed - }; - - globalOptions.fetchContext = true; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://example.com/path/file.js', - lineno: 10, - colno: 11, - 'function': 'lol', - pre_context: ['line1'], - context_line: 'line2', - post_context: ['line3'], - in_app: true - }); - }); - - it('should handle a frame without context', function() { - this.sinon.stub(window, 'extractContextFromFrame').returns(undefined); - var frame = { - url: 'http://example.com/path/file.js', - line: 10, - column: 11, - func: 'lol' - // context: [] context is stubbed - }; - - globalOptions.fetchContext = true; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://example.com/path/file.js', - lineno: 10, - colno: 11, - 'function': 'lol', - in_app: true - }); - }); - - it('should not mark `in_app` if rules match', function() { - this.sinon.stub(window, 'extractContextFromFrame').returns(undefined); - var frame = { - url: 'http://example.com/path/file.js', - line: 10, - column: 11, - func: 'lol' - // context: [] context is stubbed - }; - - globalOptions.fetchContext = true; - globalOptions.includePaths = /^http:\/\/example\.com/; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://example.com/path/file.js', - lineno: 10, - colno: 11, - 'function': 'lol', - in_app: true - }); - }); - - it('should mark `in_app` if rules do not match', function() { - this.sinon.stub(window, 'extractContextFromFrame').returns(undefined); - var frame = { - url: 'http://lol.com/path/file.js', - line: 10, - column: 11, - func: 'lol' - // context: [] context is stubbed - }; - - globalOptions.fetchContext = true; - globalOptions.includePaths = /^http:\/\/example\.com/; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://lol.com/path/file.js', - lineno: 10, - colno: 11, - 'function': 'lol', - in_app: false - }); - }); - - it('should mark `in_app` for raven.js', function() { - this.sinon.stub(window, 'extractContextFromFrame').returns(undefined); - var frame = { - url: 'http://lol.com/path/raven.js', - line: 10, - column: 11, - func: 'lol' - // context: [] context is stubbed - }; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://lol.com/path/raven.js', - lineno: 10, - colno: 11, - 'function': 'lol', - in_app: false - }); - }); - - it('should mark `in_app` for raven.min.js', function() { - this.sinon.stub(window, 'extractContextFromFrame').returns(undefined); - var frame = { - url: 'http://lol.com/path/raven.min.js', - line: 10, - column: 11, - func: 'lol' - // context: [] context is stubbed - }; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://lol.com/path/raven.min.js', - lineno: 10, - colno: 11, - 'function': 'lol', - in_app: false - }); - }); - - it('should mark `in_app` for Raven', function() { - this.sinon.stub(window, 'extractContextFromFrame').returns(undefined); - var frame = { - url: 'http://lol.com/path/file.js', - line: 10, - column: 11, - func: 'Raven.wrap' - // context: [] context is stubbed - }; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://lol.com/path/file.js', - lineno: 10, - colno: 11, - 'function': 'Raven.wrap', - in_app: false - }); - }); - - it('should mark `in_app` for TraceKit', function() { - this.sinon.stub(window, 'extractContextFromFrame').returns(undefined); - var frame = { - url: 'http://lol.com/path/file.js', - line: 10, - column: 11, - func: 'TraceKit.lol' - // context: [] context is stubbed - }; - - assert.deepEqual(normalizeFrame(frame), { - filename: 'http://lol.com/path/file.js', - lineno: 10, - colno: 11, - 'function': 'TraceKit.lol', - in_app: false - }); - }); - }); - - describe('extractContextFromFrame', function() { - it('should handle a normal frame', function() { - var frame = { - column: 2, - context: [ - 'line1', - 'line2', - 'line3', - 'line4', - 'line5', - 'culprit', - 'line7', - 'line8', - 'line9', - 'line10', - 'line11' - ] - }; - var context = extractContextFromFrame(frame); - assert.deepEqual(context, [ - ['line1', 'line2', 'line3', 'line4', 'line5'], - 'culprit', - ['line7', 'line8', 'line9', 'line10', 'line11'] - ]); - }); - - it('should return nothing if there is no context', function() { - var frame = { - column: 2 - }; - assert.isUndefined(extractContextFromFrame(frame)); - }); - - it('should reject a context if a line is too long without a column', function() { - var frame = { - context: [ - new Array(1000).join('f') // generate a line that is 1000 chars long - ] - }; - assert.isUndefined(extractContextFromFrame(frame)); - }); - - it('should reject a minified context with fetchContext disabled', function() { - var frame = { - column: 2, - context: [ - 'line1', - 'line2', - 'line3', - 'line4', - 'line5', - 'culprit', - 'line7', - 'line8', - 'line9', - 'line10', - 'line11' - ] - }; - globalOptions.fetchContext = false; - assert.isUndefined(extractContextFromFrame(frame)); - }); - - it('should truncate the minified line if there is a column number without sourcemaps enabled', function() { - // Note to future self: - // Array(51).join('f').length === 50 - var frame = { - column: 2, - context: [ - 'aa' + (new Array(51).join('f')) + (new Array(500).join('z')) - ] - }; - assert.deepEqual(extractContextFromFrame(frame), [[], new Array(51).join('f'), []]); - }); - }); - - describe('processException', function() { - it('should respect `ignoreErrors`', function() { - this.sinon.stub(window, 'send'); - - globalOptions.ignoreErrors = joinRegExp(['e1', 'e2']); - processException('Error', 'e1', 'http://example.com', []); - assert.isFalse(window.send.called); - processException('Error', 'e2', 'http://example.com', []); - assert.isFalse(window.send.called); - processException('Error', 'error', 'http://example.com', []); - assert.isTrue(window.send.calledOnce); - }); - - it('should respect `ignoreUrls`', function() { - this.sinon.stub(window, 'send'); - - globalOptions.ignoreUrls = joinRegExp([/.+?host1.+/, /.+?host2.+/]); - processException('Error', 'error', 'http://host1/', []); - assert.isFalse(window.send.called); - processException('Error', 'error', 'http://host2/', []); - assert.isFalse(window.send.called); - processException('Error', 'error', 'http://host3/', []); - assert.isTrue(window.send.calledOnce); - }); - - it('should respect `whitelistUrls`', function() { - this.sinon.stub(window, 'send'); - - globalOptions.whitelistUrls = joinRegExp([/.+?host1.+/, /.+?host2.+/]); - processException('Error', 'error', 'http://host1/', []); - assert.equal(window.send.callCount, 1); - processException('Error', 'error', 'http://host2/', []); - assert.equal(window.send.callCount, 2); - processException('Error', 'error', 'http://host3/', []); - assert.equal(window.send.callCount, 2); - }); - - it('should send a proper payload with frames', function() { - this.sinon.stub(window, 'send'); - - var frames = [ - { - filename: 'http://example.com/file1.js' - }, - { - filename: 'http://example.com/file2.js' - } - ], framesFlipped = frames.slice(0); - - framesFlipped.reverse(); - - processException('Error', 'lol', 'http://example.com/override.js', 10, frames.slice(0), {}); - assert.deepEqual(window.send.lastCall.args, [{ - exception: { - type: 'Error', - value: 'lol' - }, - stacktrace: { - frames: framesFlipped - }, - culprit: 'http://example.com/file1.js', - message: 'lol at 10' - }]); - - processException('Error', 'lol', '', 10, frames.slice(0), {}); - assert.deepEqual(window.send.lastCall.args, [{ - exception: { - type: 'Error', - value: 'lol' - }, - stacktrace: { - frames: framesFlipped - }, - culprit: 'http://example.com/file1.js', - message: 'lol at 10' - }]); - - processException('Error', 'lol', '', 10, frames.slice(0), {extra: 'awesome'}); - assert.deepEqual(window.send.lastCall.args, [{ - exception: { - type: 'Error', - value: 'lol' - }, - stacktrace: { - frames: framesFlipped - }, - culprit: 'http://example.com/file1.js', - message: 'lol at 10', - extra: 'awesome' - }]); - }); - - it('should send a proper payload without frames', function() { - this.sinon.stub(window, 'send'); - - processException('Error', 'lol', 'http://example.com/override.js', 10, [], {}); - assert.deepEqual(window.send.lastCall.args, [{ - exception: { - type: 'Error', - value: 'lol' - }, - stacktrace: { - frames: [{ - filename: 'http://example.com/override.js', - lineno: 10, - in_app: true - }] - }, - culprit: 'http://example.com/override.js', - message: 'lol at 10' - }]); - - processException('Error', 'lol', 'http://example.com/override.js', 10, [], {}); - assert.deepEqual(window.send.lastCall.args, [{ - exception: { - type: 'Error', - value: 'lol' - }, - stacktrace: { - frames: [{ - filename: 'http://example.com/override.js', - lineno: 10, - in_app: true - }] - }, - culprit: 'http://example.com/override.js', - message: 'lol at 10' - }]); - - processException('Error', 'lol', 'http://example.com/override.js', 10, [], {extra: 'awesome'}); - assert.deepEqual(window.send.lastCall.args, [{ - exception: { - type: 'Error', - value: 'lol' - }, - stacktrace: { - frames: [{ - filename: 'http://example.com/override.js', - lineno: 10, - in_app: true - }] - }, - culprit: 'http://example.com/override.js', - message: 'lol at 10', - extra: 'awesome' - }]); - }); - - it('should ignored falsey messages', function() { - this.sinon.stub(window, 'send'); - - processException('Error', '', 'http://example.com', []); - assert.isFalse(window.send.called); - - processException('TypeError', '', 'http://example.com', []); - assert.isTrue(window.send.called); - }); - - it('should not blow up with `undefined` message', function() { - this.sinon.stub(window, 'send'); - - processException('TypeError', undefined, 'http://example.com', []); - assert.isTrue(window.send.called); - }); - - it('should truncate messages to the specified length', function() { - this.sinon.stub(window, 'send'); - - processException('TypeError', new Array(500).join('a'), 'http://example.com', []); - assert.deepEqual(window.send.lastCall.args, [{ - message: new Array(101).join('a')+'\u2026 at ', - exception: { - type: 'TypeError', - value: new Array(101).join('a')+'\u2026' - }, - stacktrace: { - frames: [{ - filename: 'http://example.com', - lineno: [], - in_app: true - }] - }, - culprit: 'http://example.com', - }]); - - globalOptions.maxMessageLength = 150; - - processException('TypeError', new Array(500).join('a'), 'http://example.com', []); - assert.deepEqual(window.send.lastCall.args, [{ - message: new Array(151).join('a')+'\u2026 at ', - exception: { - type: 'TypeError', - value: new Array(151).join('a')+'\u2026' - }, - stacktrace: { - frames: [{ - filename: 'http://example.com', - lineno: [], - in_app: true - }] - }, - culprit: 'http://example.com', - }]); - }); - }); - - describe('send', function() { - it('should check `isSetup`', function() { - this.sinon.stub(window, 'isSetup').returns(false); - this.sinon.stub(window, 'makeRequest'); - - send(); - assert.isTrue(window.isSetup.calledOnce); - assert.isFalse(window.makeRequest.calledOnce); - }); - - it('should build a good data payload', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - this.sinon.stub(window, 'getHttpData').returns({ - url: 'http://localhost/?a=b', - headers: {'User-Agent': 'lolbrowser'} - }); - - globalProject = '2'; - globalOptions = { - logger: 'javascript' - }; - - send({foo: 'bar'}); - assert.deepEqual(window.makeRequest.lastCall.args[0], { - project: '2', - logger: 'javascript', - platform: 'javascript', - request: { - url: 'http://localhost/?a=b', - headers: { - 'User-Agent': 'lolbrowser' - } - }, - event_id: 'abc123', - foo: 'bar', - extra: {'session:duration': 100} - }); - }); - - it('should build a good data payload with a User', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - this.sinon.stub(window, 'getHttpData').returns({ - url: 'http://localhost/?a=b', - headers: {'User-Agent': 'lolbrowser'} - }); - - globalProject = '2'; - globalOptions = { - logger: 'javascript' - }; - - globalUser = {name: 'Matt'}; - - send({foo: 'bar'}); - assert.deepEqual(window.makeRequest.lastCall.args, [{ - project: '2', - logger: 'javascript', - platform: 'javascript', - request: { - url: 'http://localhost/?a=b', - headers: { - 'User-Agent': 'lolbrowser' - } - }, - event_id: 'abc123', - user: { - name: 'Matt' - }, - foo: 'bar', - extra: {'session:duration': 100} - }]); - }); - - it('should merge in global tags', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - this.sinon.stub(window, 'getHttpData').returns({ - url: 'http://localhost/?a=b', - headers: {'User-Agent': 'lolbrowser'} - }); - - globalProject = '2'; - globalOptions = { - logger: 'javascript', - tags: {tag1: 'value1'} - }; - - - send({tags: {tag2: 'value2'}}); - assert.deepEqual(window.makeRequest.lastCall.args, [{ - project: '2', - logger: 'javascript', - platform: 'javascript', - request: { - url: 'http://localhost/?a=b', - headers: { - 'User-Agent': 'lolbrowser' - } - }, - event_id: 'abc123', - tags: {tag1: 'value1', tag2: 'value2'}, - extra: {'session:duration': 100} - }]); - assert.deepEqual(globalOptions, { - logger: 'javascript', - tags: {tag1: 'value1'} - }); - }); - - it('should merge in global extra', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - this.sinon.stub(window, 'getHttpData').returns({ - url: 'http://localhost/?a=b', - headers: {'User-Agent': 'lolbrowser'} - }); - - globalProject = '2'; - globalOptions = { - logger: 'javascript', - extra: {key1: 'value1'} - }; - - - send({extra: {key2: 'value2'}}); - assert.deepEqual(window.makeRequest.lastCall.args, [{ - project: '2', - logger: 'javascript', - platform: 'javascript', - request: { - url: 'http://localhost/?a=b', - headers: { - 'User-Agent': 'lolbrowser' - } - }, - event_id: 'abc123', - extra: {key1: 'value1', key2: 'value2', 'session:duration': 100} - }]); - assert.deepEqual(globalOptions, { - logger: 'javascript', - extra: {key1: 'value1'} - }); - }); - - it('should let dataCallback override everything', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - - globalOptions = { - projectId: 2, - logger: 'javascript', - dataCallback: function() { - return {lol: 'ibrokeit'}; - } - }; - - globalUser = {name: 'Matt'}; - - send({foo: 'bar'}); - assert.deepEqual(window.makeRequest.lastCall.args, [{ - lol: 'ibrokeit', - event_id: 'abc123', - }]); - }); - - it('should ignore dataCallback if it does not return anything', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - this.sinon.stub(window, 'getHttpData').returns({ - url: 'http://localhost/?a=b', - headers: {'User-Agent': 'lolbrowser'} - }); - - globalProject = '2'; - globalOptions = { - logger: 'javascript', - dataCallback: function() { - return; - } - }; - - send({foo: 'bar'}); - assert.deepEqual(window.makeRequest.lastCall.args[0], { - project: '2', - logger: 'javascript', - platform: 'javascript', - request: { - url: 'http://localhost/?a=b', - headers: { - 'User-Agent': 'lolbrowser' - } - }, - event_id: 'abc123', - foo: 'bar', - extra: {'session:duration': 100} - }); - }); - - it('should strip empty tags', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - this.sinon.stub(window, 'getHttpData').returns({ - url: 'http://localhost/?a=b', - headers: {'User-Agent': 'lolbrowser'} - }); - - globalOptions = { - projectId: 2, - logger: 'javascript', - tags: {} - }; - - send({foo: 'bar', tags: {}, extra: {}}); - assert.deepEqual(window.makeRequest.lastCall.args[0], { - project: '2', - logger: 'javascript', - platform: 'javascript', - request: { - url: 'http://localhost/?a=b', - headers: { - 'User-Agent': 'lolbrowser' - } - }, - event_id: 'abc123', - foo: 'bar', - extra: {'session:duration': 100} - }); - }); - - it('should attach release if available', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(window, 'makeRequest'); - this.sinon.stub(window, 'getHttpData').returns({ - url: 'http://localhost/?a=b', - headers: {'User-Agent': 'lolbrowser'} - }); - - globalOptions = { - projectId: 2, - logger: 'javascript', - release: 'abc123', - }; - - send({foo: 'bar'}); - assert.deepEqual(window.makeRequest.lastCall.args[0], { - project: '2', - release: 'abc123', - logger: 'javascript', - platform: 'javascript', - request: { - url: 'http://localhost/?a=b', - headers: { - 'User-Agent': 'lolbrowser' - } - }, - event_id: 'abc123', - foo: 'bar', - extra: {'session:duration': 100} - }); - }); - }); - - describe('makeRequest', function() { - it('should load an Image', function() { - authQueryString = '?lol'; - globalServer = 'http://localhost/'; - var imageCache = []; - this.sinon.stub(window, 'newImage', function(){ var img = {}; imageCache.push(img); return img; }); - - makeRequest({foo: 'bar'}); - assert.equal(imageCache.length, 1); - assert.equal(imageCache[0].src, 'http://localhost/?lol&sentry_data=%7B%22foo%22%3A%22bar%22%7D'); - }); - }); - - describe('handleStackInfo', function() { - it('should work as advertised', function() { - var frame = {url: 'http://example.com'}; - this.sinon.stub(window, 'normalizeFrame').returns(frame); - this.sinon.stub(window, 'processException'); - - var stackInfo = { - name: 'Matt', - message: 'hey', - url: 'http://example.com', - lineno: 10, - stack: [ - frame, frame - ] - }; - - handleStackInfo(stackInfo, {foo: 'bar'}); - assert.deepEqual(window.processException.lastCall.args, [ - 'Matt', 'hey', 'http://example.com', 10, [frame, frame], {foo: 'bar'} - ]); - }); - - it('should work as advertised #integration', function() { - this.sinon.stub(window, 'makeRequest'); - var stackInfo = { - name: 'Error', - message: 'crap', - url: 'http://example.com', - lineno: 10, - stack: [ - { - url: 'http://example.com/file1.js', - line: 10, - column: 11, - func: 'broken', - context: [ - 'line1', - 'line2', - 'line3' - ] - }, - { - url: 'http://example.com/file2.js', - line: 12, - column: 13, - func: 'lol', - context: [ - 'line4', - 'line5', - 'line6' - ] - } - ] - }; - - handleStackInfo(stackInfo, {foo: 'bar'}); - assert.isTrue(window.makeRequest.calledOnce); - /* This is commented out because chai is broken. - - assert.deepEqual(window.makeRequest.lastCall.args, [{ - project: '2', - logger: 'javascript', - platform: 'javascript', - request: { - url: window.location.protocol + '//' + window.location.host + window.location.pathname, - querystring: window.location.search.slice(1) - }, - exception: { - type: 'Error', - value: 'crap' - }, - stacktrace: { - frames: [{ - filename: 'http://example.com/file1.js', - filename: 'file1.js', - lineno: 10, - colno: 11, - 'function': 'broken', - post_context: ['line3'], - context_line: 'line2', - pre_context: ['line1'] - }, { - filename: 'http://example.com/file2.js', - filename: 'file2.js', - lineno: 12, - colno: 13, - 'function': 'lol', - post_context: ['line6'], - context_line: 'line5', - pre_context: ['line4'] - }] - }, - culprit: 'http://example.com', - message: 'crap at 10', - foo: 'bar' - }]); - */ - }); - - it('should ignore frames that dont have a url', function() { - this.sinon.stub(window, 'normalizeFrame').returns(undefined); - this.sinon.stub(window, 'processException'); - - var stackInfo = { - name: 'Matt', - message: 'hey', - url: 'http://example.com', - lineno: 10, - stack: new Array(2) - }; - - handleStackInfo(stackInfo, {foo: 'bar'}); - assert.deepEqual(window.processException.lastCall.args, [ - 'Matt', 'hey', 'http://example.com', 10, [], {foo: 'bar'} - ]); - }); - - it('should not shit when there is no stack object from TK', function() { - this.sinon.stub(window, 'normalizeFrame').returns(undefined); - this.sinon.stub(window, 'processException'); - - var stackInfo = { - name: 'Matt', - message: 'hey', - url: 'http://example.com', - lineno: 10 - // stack: new Array(2) - }; - - handleStackInfo(stackInfo); - assert.isFalse(window.normalizeFrame.called); - assert.deepEqual(window.processException.lastCall.args, [ - 'Matt', 'hey', 'http://example.com', 10, [], undefined - ]); - }); - - it('should detect 2-words patterns (angularjs frequent case)', function() { - this.sinon.stub(window, 'normalizeFrame').returns(undefined); - this.sinon.stub(window, 'processException'); - - var stackInfo = { - name: 'new ', - message: 'hey', - url: 'http://example.com', - lineno: 10 - // stack: new Array(2) - }; - - handleStackInfo(stackInfo); - assert.isFalse(window.normalizeFrame.called); - assert.deepEqual(window.processException.lastCall.args, [ - 'new ', 'hey', 'http://example.com', 10, [], undefined - ]); - }); - }); - - describe('joinRegExp', function() { - it('should work as advertised', function() { - assert.equal(joinRegExp([ - 'a', 'b', 'a.b', /d/, /[0-9]/ - ]).source, 'a|b|a\\.b|d|[0-9]'); - }); - - it('should not process empty or undefined variables', function() { - assert.equal(joinRegExp([ - 'a', 'b', null, undefined - ]).source, 'a|b'); - }); - - it('should skip entries that are not strings or regular expressions in the passed array of patterns', function() { - assert.equal(joinRegExp([ - 'a', 'b', null, 'a.b', undefined, true, /d/, 123, {}, /[0-9]/, [] - ]).source, 'a|b|a\\.b|d|[0-9]'); - }); - }); -}); - -describe('Raven (public API)', function() { - afterEach(function() { - flushRavenState(); - }); - - describe('.VERSION', function() { - it('should have a version', function() { - assert.isString(Raven.VERSION); - }); - }); - - describe('ignore errors', function() { - it('should install default ignore errors', function() { - Raven.config('//abc@example.com/2'); - - assert.isTrue(globalOptions.ignoreErrors.test('Script error'), 'it should install "Script error" by default'); - assert.isTrue(globalOptions.ignoreErrors.test('Script error.'), 'it should install "Script error." by default'); - assert.isTrue(globalOptions.ignoreErrors.test('Javascript error: Script error on line 0'), 'it should install "Javascript error: Script error on line 0" by default'); - assert.isTrue(globalOptions.ignoreErrors.test('Javascript error: Script error. on line 0'), 'it should install "Javascript error: Script error. on line 0" by default'); - }); - }); - - describe('callback function', function() { - it('should callback a function if it is global', function() { - window.RavenConfig = { - dsn: "http://random@some.other.server:80/2", - config: {some: 'config'} - }; - - this.sinon.stub(window, 'isSetup').returns(false); - this.sinon.stub(TraceKit.report, 'subscribe'); - - afterLoad(); - - assert.equal(globalKey, 'random'); - assert.equal(globalServer, 'http://some.other.server:80/api/2/store/'); - - assert.equal(globalOptions.some, 'config'); - assert.equal(globalProject, '2'); - - assert.isTrue(window.isSetup.calledOnce); - assert.isFalse(TraceKit.report.subscribe.calledOnce); - - delete window.RavenConfig; - }); - }); - - describe('.config', function() { - it('should work with a DSN', function() { - assert.equal(Raven, Raven.config(SENTRY_DSN, {foo: 'bar'}), 'it should return Raven'); - assert.equal(globalKey, 'abc'); - assert.equal(globalServer, 'http://example.com:80/api/2/store/'); - assert.equal(globalOptions.foo, 'bar'); - assert.equal(globalProject, '2'); - assert.isTrue(isSetup()); - }); - - it('should work with a protocol relative DSN', function() { - Raven.config('//abc@example.com/2'); - assert.equal(globalKey, 'abc'); - assert.equal(globalServer, '//example.com/api/2/store/'); - assert.equal(globalProject, '2'); - assert.isTrue(isSetup()); - }); - - it('should work should work at a non root path', function() { - Raven.config('//abc@example.com/sentry/2'); - assert.equal(globalKey, 'abc'); - assert.equal(globalServer, '//example.com/sentry/api/2/store/'); - assert.equal(globalProject, '2'); - assert.isTrue(isSetup()); - }); - - it('should noop a falsey dsn', function() { - Raven.config(''); - assert.isFalse(isSetup()); - }); - - it('should return Raven for a falsey dsn', function() { - assert.equal(Raven.config(''), Raven); - }); - - it('should not set global options more than once', function() { - this.sinon.spy(window, 'parseDSN'); - this.sinon.stub(window, 'logDebug'); - setupRaven(); - setupRaven(); - assert.isTrue(parseDSN.calledOnce); - assert.isTrue(logDebug.called); - }); - - describe('whitelistUrls', function() { - it('should be false if none are passed', function() { - Raven.config('//abc@example.com/2'); - assert.equal(globalOptions.whitelistUrls, false); - }); - - it('should join into a single RegExp', function() { - Raven.config('//abc@example.com/2', { - whitelistUrls: [ - /my.app/i, - /other.app/i - ] - }); - - assert.match(globalOptions.whitelistUrls, /my.app|other.app/i); - }); - - it('should handle strings as well', function() { - Raven.config('//abc@example.com/2', { - whitelistUrls: [ - /my.app/i, - "stringy.app" - ] - }); - - assert.match(globalOptions.whitelistUrls, /my.app|stringy.app/i); - }); - }); - - describe('collectWindowErrors', function() { - it('should be true by default', function() { - Raven.config(SENTRY_DSN); - assert.isTrue(TraceKit.collectWindowErrors); - }); - - it('should be true if set to true', function() { - Raven.config(SENTRY_DSN, { - collectWindowErrors: true - }); - - assert.isTrue(TraceKit.collectWindowErrors); - }); - - it('should be false if set to false', function() { - Raven.config(SENTRY_DSN, { - collectWindowErrors: false - }); - - assert.isFalse(TraceKit.collectWindowErrors); - }); - }); - }); - - describe('.install', function() { - it('should check `isSetup`', function() { - this.sinon.stub(window, 'isSetup').returns(false); - this.sinon.stub(TraceKit.report, 'subscribe'); - Raven.install(); - assert.isTrue(window.isSetup.calledOnce); - assert.isFalse(TraceKit.report.subscribe.calledOnce); - }); - - it('should register itself with TraceKit', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(TraceKit.report, 'subscribe'); - assert.equal(Raven, Raven.install()); - assert.isTrue(TraceKit.report.subscribe.calledOnce); - assert.equal(TraceKit.report.subscribe.lastCall.args[0], handleStackInfo); - }); - - it('should not register itself more than once', function() { - this.sinon.stub(window, 'isSetup').returns(true); - this.sinon.stub(TraceKit.report, 'subscribe'); - Raven.install(); - Raven.install(); - assert.isTrue(TraceKit.report.subscribe.calledOnce); - }); - }); - - describe('.wrap', function() { - it('should return a wrapped callback', function() { - var spy = this.sinon.spy(); - var wrapped = Raven.wrap(spy); - assert.isFunction(wrapped); - assert.isTrue(wrapped.__raven__); - wrapped(); - assert.isTrue(spy.calledOnce); - }); - - it('should copy property when wrapping function', function() { - var func = function() {}; - func.test = true; - var wrapped = Raven.wrap(func); - assert.isTrue(wrapped.test); - }); - - it('should not copy prototype property when wrapping function', function() { - var func = function() {}; - func.prototype.test = true; - var wrapped = Raven.wrap(func); - assert.isUndefined(new wrapped().test); - }); - - it('should return the result of a wrapped function', function() { - var func = function() { return 'foo'; }; - var wrapped = Raven.wrap(func); - assert.equal(wrapped(), 'foo'); - }); - - it('should not wrap a non-function', function() { - assert.equal(Raven.wrap('lol'), 'lol'); - assert.equal(Raven.wrap({}, 'lol'), 'lol'); - assert.equal(Raven.wrap(undefined, 'lol'), 'lol'); - var a = [1, 2]; - assert.equal(Raven.wrap(a), a); - }); - - it('should wrap function arguments', function() { - var spy = this.sinon.spy(); - var wrapped = Raven.wrap(function(f) { - assert.isTrue(f.__raven__); - f(); - }); - wrapped(spy); - assert.isTrue(spy.calledOnce); - }); - - it('should not wrap function arguments', function() { - var spy = this.sinon.spy(); - var wrapped = Raven.wrap({ deep: false }, function(f) { - assert.isUndefined(f.__raven__); - f(); - }); - wrapped(spy); - assert.isTrue(spy.calledOnce); - }); - - it('should maintain the correct scope', function() { - var foo = {}; - var bar = function() { - assert.equal(this, foo); - }; - bar.apply(foo, []); - Raven.wrap(bar).apply(foo, []); - }); - - it('should re-raise a thrown exception', function() { - var error = new Error('lol'); - assert.throws(function() { - Raven.wrap(function() { throw error; })(); - }, error); - }); - - }); - - describe('.context', function() { - it('should execute the callback with options', function() { - var spy = this.sinon.spy(); - this.sinon.stub(Raven, 'captureException'); - Raven.context({'foo': 'bar'}, spy); - assert.isTrue(spy.calledOnce); - assert.isFalse(Raven.captureException.called); - }); - - it('should execute the callback with arguments', function() { - var spy = this.sinon.spy(); - var args = [1, 2]; - Raven.context(spy, args); - assert.deepEqual(spy.lastCall.args, args); - }); - - it('should execute the callback without options', function() { - var spy = this.sinon.spy(); - this.sinon.stub(Raven, 'captureException'); - Raven.context(spy); - assert.isTrue(spy.calledOnce); - assert.isFalse(Raven.captureException.called); - }); - - it('should capture the exception with options', function() { - var error = new Error('crap'); - var broken = function() { throw error; }; - this.sinon.stub(Raven, 'captureException'); - assert.throws(function() { - Raven.context({foo: 'bar'}, broken); - }, error); - assert.isTrue(Raven.captureException.called); - assert.deepEqual(Raven.captureException.lastCall.args, [error, {'foo': 'bar'}]); - }); - - it('should capture the exception without options', function() { - var error = new Error('crap'); - var broken = function() { throw error; }; - this.sinon.stub(Raven, 'captureException'); - assert.throws(function() { - Raven.context(broken); - }, error); - assert.isTrue(Raven.captureException.called); - assert.deepEqual(Raven.captureException.lastCall.args, [error, undefined]); - }); - - it('should execute the callback without arguments', function() { - // This is only reproducable in a browser that complains about passing - // undefined to Function.apply - var spy = this.sinon.spy(); - Raven.context(spy); - assert.deepEqual(spy.lastCall.args, []); - }); - - it('should return the result of the wrapped function', function() { - var val = {}; - var func = function() { return val; }; - assert.equal(Raven.context(func), val); - }); - }); - - describe('.uninstall', function() { - it('should uninstall from TraceKit', function() { - this.sinon.stub(TraceKit.report, 'uninstall'); - Raven.uninstall(); - assert.isTrue(TraceKit.report.uninstall.calledOnce); - }); - - it('should set isRavenInstalled flag to false', function() { - isRavenInstalled = true; - this.sinon.stub(TraceKit.report, 'uninstall'); - Raven.uninstall(); - assert.isFalse(isRavenInstalled); - }); - }); - - describe('.setUserContext', function() { - it('should set the globalUser object', function() { - Raven.setUserContext({name: 'Matt'}); - assert.deepEqual(globalUser, {name: 'Matt'}); - }); - - it('should clear the globalUser with no arguments', function() { - globalUser = {name: 'Matt'}; - Raven.setUserContext(); - assert.isUndefined(globalUser); - }); - }); - - describe('.setExtraContext', function() { - it('should set the globalOptions.extra object', function() { - Raven.setExtraContext({name: 'Matt'}); - assert.deepEqual(globalOptions.extra, {name: 'Matt'}); - }); - - it('should clear globalOptions.extra with no arguments', function() { - globalOptions = {name: 'Matt'}; - Raven.setExtraContext(); - assert.deepEqual(globalOptions.extra, {}); - }); - }); - - describe('.setTagsContext', function() { - it('should set the globalOptions.tags object', function() { - Raven.setTagsContext({name: 'Matt'}); - assert.deepEqual(globalOptions.tags, {name: 'Matt'}); - }); - - it('should clear globalOptions.tags with no arguments', function() { - globalOptions = {name: 'Matt'}; - Raven.setTagsContext(); - assert.deepEqual(globalOptions.tags, {}); - }); - }); - - describe('.setReleaseContext', function() { - it('should set the globalOptions.release attribute', function() { - Raven.setReleaseContext('abc123'); - assert.equal(globalOptions.release, 'abc123'); - }); - - it('should clear globalOptions.release with no arguments', function() { - globalOptions.release = 'abc123'; - Raven.setReleaseContext(); - assert.isUndefined(globalOptions.release); - }); - }); - - describe('.setDataCallback', function() { - it('should set the globalOptions.dataCallback attribute', function() { - var foo = function(){}; - Raven.setDataCallback(foo); - assert.equal(globalOptions.dataCallback, foo); - }); - - it('should clear globalOptions.dataCallback with no arguments', function() { - var foo = function(){}; - globalOptions.dataCallback = foo; - Raven.setDataCallback(); - assert.isUndefined(globalOptions.dataCallback); - }); - }); - - describe('.setShouldSendCallback', function() { - it('should set the globalOptions.shouldSendCallback attribute', function() { - var foo = function(){}; - Raven.setShouldSendCallback(foo); - assert.equal(globalOptions.shouldSendCallback, foo); - }); - - it('should clear globalOptions.shouldSendCallback with no arguments', function() { - var foo = function(){}; - globalOptions.shouldSendCallback = foo; - Raven.setShouldSendCallback(); - assert.isUndefined(globalOptions.shouldSendCallback); - }); - }); - - describe('.captureMessage', function() { - it('should work as advertised', function() { - this.sinon.stub(window, 'send'); - Raven.captureMessage('lol', {foo: 'bar'}); - assert.deepEqual(window.send.lastCall.args, [{ - message: 'lol', - foo: 'bar' - }]); - }); - - it('should coerce message to a string', function() { - this.sinon.stub(window, 'send'); - Raven.captureMessage({}); - assert.deepEqual(window.send.lastCall.args, [{ - message: '[object Object]' - }]); - }); - - it('should work as advertised #integration', function() { - var imageCache = []; - this.sinon.stub(window, 'newImage', function(){ var img = {}; imageCache.push(img); return img; }); - - setupRaven(); - Raven.captureMessage('lol', {foo: 'bar'}); - assert.equal(imageCache.length, 1); - // It'd be hard to assert the actual payload being sent - // since it includes the generated url, which is going to - // vary between users running the tests - // Unit tests should cover that the payload was constructed properly - }); - - it('should tag lastEventId #integration', function() { - setupRaven(); - Raven.captureMessage('lol'); - assert.equal(Raven.lastEventId(), 'abc123'); - }); - - it('should respect `ignoreErrors`', function() { - this.sinon.stub(window, 'send'); - - globalOptions.ignoreErrors = joinRegExp(['e1', 'e2']); - Raven.captureMessage('e1'); - assert.isFalse(window.send.called); - Raven.captureMessage('e2'); - assert.isFalse(window.send.called); - Raven.captureMessage('Non-ignored error'); - assert.isTrue(window.send.calledOnce); - }); - }); - - describe('.captureException', function() { - it('should call TraceKit.report', function() { - var error = new Error('crap'); - this.sinon.stub(TraceKit, 'report'); - Raven.captureException(error, {foo: 'bar'}); - assert.isTrue(TraceKit.report.calledOnce); - assert.deepEqual(TraceKit.report.lastCall.args, [error, {foo: 'bar'}]); - }); - - it('should store the last exception', function() { - var error = new Error('crap'); - this.sinon.stub(TraceKit, 'report'); - Raven.captureException(error); - assert.equal(Raven.lastException(), error); - }); - - it('shouldn\'t reraise the if the error is the same error', function() { - var error = new Error('crap'); - this.sinon.stub(TraceKit, 'report').throws(error); - // this would raise if the errors didn't match - Raven.captureException(error, {foo: 'bar'}); - assert.isTrue(TraceKit.report.calledOnce); - }); - - it('should reraise a different error', function() { - var error = new Error('crap1'); - this.sinon.stub(TraceKit, 'report').throws(error); - assert.throws(function() { - Raven.captureException(new Error('crap2')); - }, error); - }); - - it('should capture as a normal message if a non-Error is passed', function() { - this.sinon.stub(Raven, 'captureMessage'); - this.sinon.stub(TraceKit, 'report'); - Raven.captureException('derp'); - assert.equal(Raven.captureMessage.lastCall.args[0], 'derp'); - assert.isFalse(TraceKit.report.called); - Raven.captureException(true); - assert.equal(Raven.captureMessage.lastCall.args[0], true); - assert.isFalse(TraceKit.report.called); - }); - }); - - describe('.isSetup', function() { - it('should work as advertised', function() { - var isSetup = this.sinon.stub(window, 'isSetup'); - isSetup.returns(true); - assert.isTrue(Raven.isSetup()); - isSetup.returns(false); - assert.isFalse(Raven.isSetup()); - }); - }); -}); diff --git a/htdocs/includes/raven-js/vendor/TraceKit/tracekit.js b/htdocs/includes/raven-js/vendor/TraceKit/tracekit.js deleted file mode 100644 index bccddabedbe..00000000000 --- a/htdocs/includes/raven-js/vendor/TraceKit/tracekit.js +++ /dev/null @@ -1,1044 +0,0 @@ -/* - TraceKit - Cross brower stack traces - github.com/occ/TraceKit - MIT license -*/ - -var TraceKit = { - remoteFetching: false, - collectWindowErrors: true, - // 3 lines before, the offending line, 3 lines after - linesOfContext: 7 -}; - -// global reference to slice -var _slice = [].slice; -var UNKNOWN_FUNCTION = '?'; - - -/** - * TraceKit.wrap: Wrap any function in a TraceKit reporter - * Example: func = TraceKit.wrap(func); - * - * @param {Function} func Function to be wrapped - * @return {Function} The wrapped func - */ -TraceKit.wrap = function traceKitWrapper(func) { - function wrapped() { - try { - return func.apply(this, arguments); - } catch (e) { - TraceKit.report(e); - throw e; - } - } - return wrapped; -}; - -/** - * TraceKit.report: cross-browser processing of unhandled exceptions - * - * Syntax: - * TraceKit.report.subscribe(function(stackInfo) { ... }) - * TraceKit.report.unsubscribe(function(stackInfo) { ... }) - * TraceKit.report(exception) - * try { ...code... } catch(ex) { TraceKit.report(ex); } - * - * Supports: - * - Firefox: full stack trace with line numbers, plus column number - * on top frame; column number is not guaranteed - * - Opera: full stack trace with line and column numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - IE: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - * In theory, TraceKit should work on all of the following versions: - * - IE5.5+ (only 8.0 tested) - * - Firefox 0.9+ (only 3.5+ tested) - * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require - * Exceptions Have Stacktrace to be enabled in opera:config) - * - Safari 3+ (only 4+ tested) - * - Chrome 1+ (only 5+ tested) - * - Konqueror 3.5+ (untested) - * - * Requires TraceKit.computeStackTrace. - * - * Tries to catch all unhandled exceptions and report them to the - * subscribed handlers. Please note that TraceKit.report will rethrow the - * exception. This is REQUIRED in order to get a useful stack trace in IE. - * If the exception does not reach the top of the browser, you will only - * get a stack trace from the point where TraceKit.report was called. - * - * Handlers receive a stackInfo object as described in the - * TraceKit.computeStackTrace docs. - */ -TraceKit.report = (function reportModuleWrapper() { - var handlers = [], - lastArgs = null, - lastException = null, - lastExceptionStack = null; - - /** - * Add a crash handler. - * @param {Function} handler - */ - function subscribe(handler) { - installGlobalHandler(); - handlers.push(handler); - } - - /** - * Remove a crash handler. - * @param {Function} handler - */ - function unsubscribe(handler) { - for (var i = handlers.length - 1; i >= 0; --i) { - if (handlers[i] === handler) { - handlers.splice(i, 1); - } - } - } - - /** - * Remove all crash handlers. - */ - function unsubscribeAll() { - uninstallGlobalHandler(); - handlers = []; - } - - /** - * Dispatch stack information to all handlers. - * @param {Object.} stack - */ - function notifyHandlers(stack, isWindowError) { - var exception = null; - if (isWindowError && !TraceKit.collectWindowErrors) { - return; - } - for (var i in handlers) { - if (hasKey(handlers, i)) { - try { - handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2))); - } catch (inner) { - exception = inner; - } - } - } - - if (exception) { - throw exception; - } - } - - var _oldOnerrorHandler, _onErrorHandlerInstalled; - - /** - * Ensures all global unhandled exceptions are recorded. - * Supported by Gecko and IE. - * @param {string} message Error message. - * @param {string} url URL of script that generated the exception. - * @param {(number|string)} lineNo The line number at which the error - * occurred. - * @param {?(number|string)} colNo The column number at which the error - * occurred. - * @param {?Error} ex The actual Error object. - */ - function traceKitWindowOnError(message, url, lineNo, colNo, ex) { - var stack = null; - - if (lastExceptionStack) { - TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message); - processLastException(); - } else if (ex) { - // New chrome and blink send along a real error object - // Let's just report that like a normal error. - // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror - stack = TraceKit.computeStackTrace(ex); - notifyHandlers(stack, true); - } else { - var location = { - 'url': url, - 'line': lineNo, - 'column': colNo - }; - location.func = TraceKit.computeStackTrace.guessFunctionName(location.url, location.line); - location.context = TraceKit.computeStackTrace.gatherContext(location.url, location.line); - stack = { - 'message': message, - 'url': document.location.href, - 'stack': [location] - }; - notifyHandlers(stack, true); - } - - if (_oldOnerrorHandler) { - return _oldOnerrorHandler.apply(this, arguments); - } - - return false; - } - - function installGlobalHandler () - { - if (_onErrorHandlerInstalled) { - return; - } - _oldOnerrorHandler = window.onerror; - window.onerror = traceKitWindowOnError; - _onErrorHandlerInstalled = true; - } - - function uninstallGlobalHandler () - { - if (!_onErrorHandlerInstalled) { - return; - } - window.onerror = _oldOnerrorHandler; - _onErrorHandlerInstalled = false; - _oldOnerrorHandler = undefined; - } - - function processLastException() { - var _lastExceptionStack = lastExceptionStack, - _lastArgs = lastArgs; - lastArgs = null; - lastExceptionStack = null; - lastException = null; - notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs)); - } - - /** - * Reports an unhandled Error to TraceKit. - * @param {Error} ex - * @param {?boolean} rethrow If false, do not re-throw the exception. - * Only used for window.onerror to not cause an infinite loop of - * rethrowing. - */ - function report(ex, rethrow) { - var args = _slice.call(arguments, 1); - if (lastExceptionStack) { - if (lastException === ex) { - return; // already caught by an inner catch block, ignore - } else { - processLastException(); - } - } - - var stack = TraceKit.computeStackTrace(ex); - lastExceptionStack = stack; - lastException = ex; - lastArgs = args; - - // If the stack trace is incomplete, wait for 2 seconds for - // slow slow IE to see if onerror occurs or not before reporting - // this exception; otherwise, we will end up with an incomplete - // stack trace - window.setTimeout(function () { - if (lastException === ex) { - processLastException(); - } - }, (stack.incomplete ? 2000 : 0)); - - if (rethrow !== false) { - throw ex; // re-throw to propagate to the top level (and cause window.onerror) - } - } - - report.subscribe = subscribe; - report.unsubscribe = unsubscribe; - report.uninstall = unsubscribeAll; - return report; -}()); - -/** - * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript - * - * Syntax: - * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below) - * Returns: - * s.name - exception name - * s.message - exception message - * s.stack[i].url - JavaScript or HTML file URL - * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work) - * s.stack[i].args - arguments passed to the function, if known - * s.stack[i].line - line number, if known - * s.stack[i].column - column number, if known - * s.stack[i].context - an array of source code lines; the middle element corresponds to the correct line# - * - * Supports: - * - Firefox: full stack trace with line numbers and unreliable column - * number on top frame - * - Opera 10: full stack trace with line and column numbers - * - Opera 9-: full stack trace with line numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the topmost stacktrace element - * only - * - IE: no line numbers whatsoever - * - * Tries to guess names of anonymous functions by looking for assignments - * in the source code. In IE and Safari, we have to guess source file names - * by searching for function bodies inside all page scripts. This will not - * work for scripts that are loaded cross-domain. - * Here be dragons: some function names may be guessed incorrectly, and - * duplicate functions may be mismatched. - * - * TraceKit.computeStackTrace should only be used for tracing purposes. - * Logging of unhandled exceptions should be done with TraceKit.report, - * which builds on top of TraceKit.computeStackTrace and provides better - * IE support by utilizing the window.onerror event to retrieve information - * about the top of the stack. - * - * Note: In IE and Safari, no stack trace is recorded on the Error object, - * so computeStackTrace instead walks its *own* chain of callers. - * This means that: - * * in Safari, some methods may be missing from the stack trace; - * * in IE, the topmost function in the stack trace will always be the - * caller of computeStackTrace. - * - * This is okay for tracing (because you are likely to be calling - * computeStackTrace from the function you want to be the topmost element - * of the stack trace anyway), but not okay for logging unhandled - * exceptions (because your catch block will likely be far away from the - * inner function that actually caused the exception). - * - */ -TraceKit.computeStackTrace = (function computeStackTraceWrapper() { - var debug = false, - sourceCache = {}; - - /** - * Attempts to retrieve source code via XMLHttpRequest, which is used - * to look up anonymous function names. - * @param {string} url URL of source code. - * @return {string} Source contents. - */ - function loadSource(url) { - if (!TraceKit.remoteFetching) { //Only attempt request if remoteFetching is on. - return ''; - } - try { - var getXHR = function() { - try { - return new window.XMLHttpRequest(); - } catch (e) { - // explicitly bubble up the exception if not found - return new window.ActiveXObject('Microsoft.XMLHTTP'); - } - }; - - var request = getXHR(); - request.open('GET', url, false); - request.send(''); - return request.responseText; - } catch (e) { - return ''; - } - } - - /** - * Retrieves source code from the source code cache. - * @param {string} url URL of source code. - * @return {Array.} Source contents. - */ - function getSource(url) { - if (!isString(url)) return []; - if (!hasKey(sourceCache, url)) { - // URL needs to be able to fetched within the acceptable domain. Otherwise, - // cross-domain errors will be triggered. - var source = ''; - if (url.indexOf(document.domain) !== -1) { - source = loadSource(url); - } - sourceCache[url] = source ? source.split('\n') : []; - } - - return sourceCache[url]; - } - - /** - * Tries to use an externally loaded copy of source code to determine - * the name of a function by looking at the name of the variable it was - * assigned to, if any. - * @param {string} url URL of source code. - * @param {(string|number)} lineNo Line number in source code. - * @return {string} The function name, if discoverable. - */ - function guessFunctionName(url, lineNo) { - var reFunctionArgNames = /function ([^(]*)\(([^)]*)\)/, - reGuessFunction = /['"]?([0-9A-Za-z$_]+)['"]?\s*[:=]\s*(function|eval|new Function)/, - line = '', - maxLines = 10, - source = getSource(url), - m; - - if (!source.length) { - return UNKNOWN_FUNCTION; - } - - // Walk backwards from the first line in the function until we find the line which - // matches the pattern above, which is the function definition - for (var i = 0; i < maxLines; ++i) { - line = source[lineNo - i] + line; - - if (!isUndefined(line)) { - if ((m = reGuessFunction.exec(line))) { - return m[1]; - } else if ((m = reFunctionArgNames.exec(line))) { - return m[1]; - } - } - } - - return UNKNOWN_FUNCTION; - } - - /** - * Retrieves the surrounding lines from where an exception occurred. - * @param {string} url URL of source code. - * @param {(string|number)} line Line number in source code to centre - * around for context. - * @return {?Array.} Lines of source code. - */ - function gatherContext(url, line) { - var source = getSource(url); - - if (!source.length) { - return null; - } - - var context = [], - // linesBefore & linesAfter are inclusive with the offending line. - // if linesOfContext is even, there will be one extra line - // *before* the offending line. - linesBefore = Math.floor(TraceKit.linesOfContext / 2), - // Add one extra line if linesOfContext is odd - linesAfter = linesBefore + (TraceKit.linesOfContext % 2), - start = Math.max(0, line - linesBefore - 1), - end = Math.min(source.length, line + linesAfter - 1); - - line -= 1; // convert to 0-based index - - for (var i = start; i < end; ++i) { - if (!isUndefined(source[i])) { - context.push(source[i]); - } - } - - return context.length > 0 ? context : null; - } - - /** - * Escapes special characters, except for whitespace, in a string to be - * used inside a regular expression as a string literal. - * @param {string} text The string. - * @return {string} The escaped string literal. - */ - function escapeRegExp(text) { - return text.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g, '\\$&'); - } - - /** - * Escapes special characters in a string to be used inside a regular - * expression as a string literal. Also ensures that HTML entities will - * be matched the same as their literal friends. - * @param {string} body The string. - * @return {string} The escaped string. - */ - function escapeCodeAsRegExpForMatchingInsideHTML(body) { - return escapeRegExp(body).replace('<', '(?:<|<)').replace('>', '(?:>|>)').replace('&', '(?:&|&)').replace('"', '(?:"|")').replace(/\s+/g, '\\s+'); - } - - /** - * Determines where a code fragment occurs in the source code. - * @param {RegExp} re The function definition. - * @param {Array.} urls A list of URLs to search. - * @return {?Object.} An object containing - * the url, line, and column number of the defined function. - */ - function findSourceInUrls(re, urls) { - var source, m; - for (var i = 0, j = urls.length; i < j; ++i) { - // console.log('searching', urls[i]); - if ((source = getSource(urls[i])).length) { - source = source.join('\n'); - if ((m = re.exec(source))) { - // console.log('Found function in ' + urls[i]); - - return { - 'url': urls[i], - 'line': source.substring(0, m.index).split('\n').length, - 'column': m.index - source.lastIndexOf('\n', m.index) - 1 - }; - } - } - } - - // console.log('no match'); - - return null; - } - - /** - * Determines at which column a code fragment occurs on a line of the - * source code. - * @param {string} fragment The code fragment. - * @param {string} url The URL to search. - * @param {(string|number)} line The line number to examine. - * @return {?number} The column number. - */ - function findSourceInLine(fragment, url, line) { - var source = getSource(url), - re = new RegExp('\\b' + escapeRegExp(fragment) + '\\b'), - m; - - line -= 1; - - if (source && source.length > line && (m = re.exec(source[line]))) { - return m.index; - } - - return null; - } - - /** - * Determines where a function was defined within the source code. - * @param {(Function|string)} func A function reference or serialized - * function definition. - * @return {?Object.} An object containing - * the url, line, and column number of the defined function. - */ - function findSourceByFunctionBody(func) { - var urls = [window.location.href], - scripts = document.getElementsByTagName('script'), - body, - code = '' + func, - codeRE = /^function(?:\s+([\w$]+))?\s*\(([\w\s,]*)\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/, - eventRE = /^function on([\w$]+)\s*\(event\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/, - re, - parts, - result; - - for (var i = 0; i < scripts.length; ++i) { - var script = scripts[i]; - if (script.src) { - urls.push(script.src); - } - } - - if (!(parts = codeRE.exec(code))) { - re = new RegExp(escapeRegExp(code).replace(/\s+/g, '\\s+')); - } - - // not sure if this is really necessary, but I don’t have a test - // corpus large enough to confirm that and it was in the original. - else { - var name = parts[1] ? '\\s+' + parts[1] : '', - args = parts[2].split(',').join('\\s*,\\s*'); - - body = escapeRegExp(parts[3]).replace(/;$/, ';?'); // semicolon is inserted if the function ends with a comment.replace(/\s+/g, '\\s+'); - re = new RegExp('function' + name + '\\s*\\(\\s*' + args + '\\s*\\)\\s*{\\s*' + body + '\\s*}'); - } - - // look for a normal function definition - if ((result = findSourceInUrls(re, urls))) { - return result; - } - - // look for an old-school event handler function - if ((parts = eventRE.exec(code))) { - var event = parts[1]; - body = escapeCodeAsRegExpForMatchingInsideHTML(parts[2]); - - // look for a function defined in HTML as an onXXX handler - re = new RegExp('on' + event + '=[\\\'"]\\s*' + body + '\\s*[\\\'"]', 'i'); - - if ((result = findSourceInUrls(re, urls[0]))) { - return result; - } - - // look for ??? - re = new RegExp(body); - - if ((result = findSourceInUrls(re, urls))) { - return result; - } - } - - return null; - } - - // Contents of Exception in various browsers. - // - // SAFARI: - // ex.message = Can't find variable: qq - // ex.line = 59 - // ex.sourceId = 580238192 - // ex.sourceURL = http://... - // ex.expressionBeginOffset = 96 - // ex.expressionCaretOffset = 98 - // ex.expressionEndOffset = 98 - // ex.name = ReferenceError - // - // FIREFOX: - // ex.message = qq is not defined - // ex.fileName = http://... - // ex.lineNumber = 59 - // ex.columnNumber = 69 - // ex.stack = ...stack trace... (see the example below) - // ex.name = ReferenceError - // - // CHROME: - // ex.message = qq is not defined - // ex.name = ReferenceError - // ex.type = not_defined - // ex.arguments = ['aa'] - // ex.stack = ...stack trace... - // - // INTERNET EXPLORER: - // ex.message = ... - // ex.name = ReferenceError - // - // OPERA: - // ex.message = ...message... (see the example below) - // ex.name = ReferenceError - // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message) - // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace' - - /** - * Computes stack trace information from the stack property. - * Chrome and Gecko use this property. - * @param {Error} ex - * @return {?Object.} Stack trace information. - */ - function computeStackTraceFromStackProp(ex) { - if (!ex.stack) { - return null; - } - - var chrome = /^\s*at (.*?) ?\(?((?:file|https?|chrome-extension):.*?):(\d+)(?::(\d+))?\)?\s*$/i, - gecko = /^\s*(.*?)(?:\((.*?)\))?@((?:file|https?|chrome).*?):(\d+)(?::(\d+))?\s*$/i, - lines = ex.stack.split('\n'), - stack = [], - parts, - element, - reference = /^(.*) is undefined$/.exec(ex.message); - - for (var i = 0, j = lines.length; i < j; ++i) { - if ((parts = gecko.exec(lines[i]))) { - element = { - 'url': parts[3], - 'func': parts[1] || UNKNOWN_FUNCTION, - 'args': parts[2] ? parts[2].split(',') : '', - 'line': +parts[4], - 'column': parts[5] ? +parts[5] : null - }; - } else if ((parts = chrome.exec(lines[i]))) { - element = { - 'url': parts[2], - 'func': parts[1] || UNKNOWN_FUNCTION, - 'line': +parts[3], - 'column': parts[4] ? +parts[4] : null - }; - } else { - continue; - } - - if (!element.func && element.line) { - element.func = guessFunctionName(element.url, element.line); - } - - if (element.line) { - element.context = gatherContext(element.url, element.line); - } - - stack.push(element); - } - - if (!stack.length) { - return null; - } - - if (stack[0].line && !stack[0].column && reference) { - stack[0].column = findSourceInLine(reference[1], stack[0].url, stack[0].line); - } else if (!stack[0].column && !isUndefined(ex.columnNumber)) { - // FireFox uses this awesome columnNumber property for its top frame - // Also note, Firefox's column number is 0-based and everything else expects 1-based, - // so adding 1 - stack[0].column = ex.columnNumber + 1; - } - - return { - 'name': ex.name, - 'message': ex.message, - 'url': document.location.href, - 'stack': stack - }; - } - - /** - * Computes stack trace information from the stacktrace property. - * Opera 10 uses this property. - * @param {Error} ex - * @return {?Object.} Stack trace information. - */ - function computeStackTraceFromStacktraceProp(ex) { - // Access and store the stacktrace property before doing ANYTHING - // else to it because Opera is not very good at providing it - // reliably in other circumstances. - var stacktrace = ex.stacktrace; - - var testRE = / line (\d+), column (\d+) in (?:]+)>|([^\)]+))\((.*)\) in (.*):\s*$/i, - lines = stacktrace.split('\n'), - stack = [], - parts; - - for (var i = 0, j = lines.length; i < j; i += 2) { - if ((parts = testRE.exec(lines[i]))) { - var element = { - 'line': +parts[1], - 'column': +parts[2], - 'func': parts[3] || parts[4], - 'args': parts[5] ? parts[5].split(',') : [], - 'url': parts[6] - }; - - if (!element.func && element.line) { - element.func = guessFunctionName(element.url, element.line); - } - if (element.line) { - try { - element.context = gatherContext(element.url, element.line); - } catch (exc) {} - } - - if (!element.context) { - element.context = [lines[i + 1]]; - } - - stack.push(element); - } - } - - if (!stack.length) { - return null; - } - - return { - 'name': ex.name, - 'message': ex.message, - 'url': document.location.href, - 'stack': stack - }; - } - - /** - * NOT TESTED. - * Computes stack trace information from an error message that includes - * the stack trace. - * Opera 9 and earlier use this method if the option to show stack - * traces is turned on in opera:config. - * @param {Error} ex - * @return {?Object.} Stack information. - */ - function computeStackTraceFromOperaMultiLineMessage(ex) { - // Opera includes a stack trace into the exception message. An example is: - // - // Statement on line 3: Undefined variable: undefinedFunc - // Backtrace: - // Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js: In function zzz - // undefinedFunc(a); - // Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function yyy - // zzz(x, y, z); - // Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function xxx - // yyy(a, a, a); - // Line 1 of function script - // try { xxx('hi'); return false; } catch(ex) { TraceKit.report(ex); } - // ... - - var lines = ex.message.split('\n'); - if (lines.length < 4) { - return null; - } - - var lineRE1 = /^\s*Line (\d+) of linked script ((?:file|https?)\S+)(?:: in function (\S+))?\s*$/i, - lineRE2 = /^\s*Line (\d+) of inline#(\d+) script in ((?:file|https?)\S+)(?:: in function (\S+))?\s*$/i, - lineRE3 = /^\s*Line (\d+) of function script\s*$/i, - stack = [], - scripts = document.getElementsByTagName('script'), - inlineScriptBlocks = [], - parts, - i, - len, - source; - - for (i in scripts) { - if (hasKey(scripts, i) && !scripts[i].src) { - inlineScriptBlocks.push(scripts[i]); - } - } - - for (i = 2, len = lines.length; i < len; i += 2) { - var item = null; - if ((parts = lineRE1.exec(lines[i]))) { - item = { - 'url': parts[2], - 'func': parts[3], - 'line': +parts[1] - }; - } else if ((parts = lineRE2.exec(lines[i]))) { - item = { - 'url': parts[3], - 'func': parts[4] - }; - var relativeLine = (+parts[1]); // relative to the start of the + '; + + return $ret; + } + /** * Return combo list of activated countries, into language of user * @@ -2648,7 +2714,7 @@ class Form * @param int $maxlength Max length of label * @return void */ - function select_types_paiements($selected='',$htmlname='paiementtype',$filtertype='',$format=0, $empty=0, $noadmininfo=0,$maxlength=0) + function select_types_paiements($selected='', $htmlname='paiementtype', $filtertype='', $format=0, $empty=0, $noadmininfo=0, $maxlength=0) { global $langs,$user; diff --git a/htdocs/core/class/html.formmail.class.php b/htdocs/core/class/html.formmail.class.php index 1f0cb5c6e28..c9e8ab7899d 100644 --- a/htdocs/core/class/html.formmail.class.php +++ b/htdocs/core/class/html.formmail.class.php @@ -648,7 +648,7 @@ class FormMail extends Form } if ($this->param["models"]=='facture_send') { - $url=getPaypalPaymentUrl(0,'invoice',$this->substit['__FACREF__']); + $url=getPaypalPaymentUrl(0,'invoice',$this->substit['__REF__']); $this->substit['__PERSONALIZED__']=str_replace('\n',"\n",$langs->transnoentitiesnoconv("PredefinedMailContentLink",$url)); } } @@ -692,7 +692,7 @@ class FormMail extends Form else $this->withfckeditor=0; } - $doleditor=new DolEditor('message',$defaultmessage,'',280,$this->ckeditortoolbar,'In',true,true,$this->withfckeditor,8,72); + $doleditor=new DolEditor('message',$defaultmessage,'',280,$this->ckeditortoolbar,'In',true,true,$this->withfckeditor,8,'95%'); $out.= $doleditor->Create(1); } $out.= "\n"; diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index fe6582fd355..82cdbe03b64 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -2338,13 +2338,13 @@ else $formmail->withto=GETPOST("sendto")?GETPOST("sendto"):$liste; $formmail->withtocc=$liste; $formmail->withtoccc=$conf->global->MAIN_EMAIL_USECCC; - $formmail->withtopic=$outputlangs->trans('SendBillRef','__FACREF__'); + $formmail->withtopic=$outputlangs->trans('SendBillRef','__REF__'); $formmail->withfile=2; $formmail->withbody=1; $formmail->withdeliveryreceipt=1; $formmail->withcancel=1; // Tableau des substitutions - $formmail->substit['__FACREF__']=$object->ref; + $formmail->substit['__REF__']=$object->ref; $formmail->substit['__SIGNATURE__']=$user->signature; $formmail->substit['__PERSONALIZED__']=''; $formmail->substit['__CONTACTCIVNAME__']=''; diff --git a/htdocs/langs/en_US/bills.lang b/htdocs/langs/en_US/bills.lang index c347c7a0336..a567fd4f062 100644 --- a/htdocs/langs/en_US/bills.lang +++ b/htdocs/langs/en_US/bills.lang @@ -74,6 +74,7 @@ PaymentsAlreadyDone=Payments already done PaymentsBackAlreadyDone=Payments back already done PaymentRule=Payment rule PaymentMode=Payment type +PaymentModeShort=Payment type PaymentTerm=Payment term PaymentConditions=Payment terms PaymentConditionsShort=Payment terms diff --git a/htdocs/langs/en_US/mails.lang b/htdocs/langs/en_US/mails.lang index df5ad878657..bda203ce05f 100644 --- a/htdocs/langs/en_US/mails.lang +++ b/htdocs/langs/en_US/mails.lang @@ -84,9 +84,12 @@ EachInvoiceWillBeAttachedToEmail=A document using default invoice document templ MailTopicSendRemindUnpaidInvoices=Reminder of invoice %s (%s) SendRemind=Send reminder by EMails RemindSent=%s reminder(s) sent -AllRecipientSelectedForRemind=All thirdparties selected and if an email is set. +AllRecipientSelected=All thirdparties selected and if an email is set. NoRemindSent=No EMail reminder sent -ResultOfMassSending=Result of mass EMail reminders sending +ResultOfMailSending=Result of mass EMail sending +NbSelected=Nb selected +NbIgnored=Nb ignored +NbSent=Nb sent # Libelle des modules de liste de destinataires mailing MailingModuleDescContactCompanies=Contacts/addresses of all third parties (customer, prospect, supplier, ...) diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 070bc5c3d56..db1cebac45d 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -698,6 +698,7 @@ Deductible=Deductible from=from toward=toward Access=Access +SelectAction=Select action HelpCopyToClipboard=Use Ctrl+C to copy to clipboard SaveUploadedFileWithMask=Save file on server with name "%s" (otherwise "%s") OriginFileName=Original filename diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang index 1ff53d36797..d2faa9baae5 100644 --- a/htdocs/langs/en_US/other.lang +++ b/htdocs/langs/en_US/other.lang @@ -58,13 +58,13 @@ Miscellaneous=Miscellaneous NbOfActiveNotifications=Number of notifications (nb of recipient emails) PredefinedMailTest=This is a test mail.\nThe two lines are separated by a carriage return.\n\n__SIGNATURE__ PredefinedMailTestHtml=This is a test mail (the word test must be in bold).
The two lines are separated by a carriage return.

__SIGNATURE__ -PredefinedMailContentSendInvoice=__CONTACTCIVNAME__\n\nYou will find here the invoice __FACREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ -PredefinedMailContentSendInvoiceReminder=__CONTACTCIVNAME__\n\nWe would like to warn you that the invoice __FACREF__ seems to not being payed. So this is the invoice in attachment again, as a reminder.\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ +PredefinedMailContentSendInvoice=__CONTACTCIVNAME__\n\nYou will find here the invoice __REF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ +PredefinedMailContentSendInvoiceReminder=__CONTACTCIVNAME__\n\nWe would like to warn you that the invoice __REF__ seems to not being payed. So this is the invoice in attachment again, as a reminder.\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ PredefinedMailContentSendProposal=__CONTACTCIVNAME__\n\nYou will find here the commercial proposal __PROPREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ PredefinedMailContentSendSupplierProposal=__CONTACTCIVNAME__\n\nYou will find here the price request __ASKREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ PredefinedMailContentSendOrder=__CONTACTCIVNAME__\n\nYou will find here the order __ORDERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ PredefinedMailContentSendSupplierOrder=__CONTACTCIVNAME__\n\nYou will find here our order __ORDERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ -PredefinedMailContentSendSupplierInvoice=__CONTACTCIVNAME__\n\nYou will find here the invoice __FACREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ +PredefinedMailContentSendSupplierInvoice=__CONTACTCIVNAME__\n\nYou will find here the invoice __REF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ PredefinedMailContentSendShipping=__CONTACTCIVNAME__\n\nYou will find here the shipping __SHIPPINGREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ PredefinedMailContentSendFichInter=__CONTACTCIVNAME__\n\nYou will find here the intervention __FICHINTERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__ PredefinedMailContentThirdparty=__CONTACTCIVNAME__\n\n__PERSONALIZED__\n\n__SIGNATURE__ From 9aaab2c1dc4049c10041d7a669702fce3a4d8472 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 2 Dec 2015 23:20:19 +0100 Subject: [PATCH 099/206] Work on select fields on project list --- htdocs/projet/list.php | 67 ++++++++++++++++++++++++++++++++--------- htdocs/societe/list.php | 10 +++--- 2 files changed, 58 insertions(+), 19 deletions(-) diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index c4e8b8f5783..a50595db609 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -84,8 +84,58 @@ $syear = GETPOST('syear','int'); if ($search_status == '') $search_status=-1; // -1 or 1 -// Purge criteria -if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers +// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array +$contextpage='projectlist'; + +// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array +$hookmanager->initHooks(array($contextpage)); +$extrafields = new ExtraFields($db); + +// fetch optionals attributes and labels +$extralabels = $extrafields->fetch_name_optionals_label('project'); +$search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_'); + +// List of fields to search into when doing a "search in all" +$fieldstosearchall = array( + 'p.ref'=>"Ref", + 'p.title'=>"Label", + 's.nom'=>"ThirdPartyName", + "p.note_public"=>"NotePublic" +); +if (empty($user->socid)) $fieldstosearchall["p.note_private"]="NotePrivate"; + +$arrayfields=array( + 'p.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), + 'p.label'=>array('label'=>$langs->trans("Label"), 'checked'=>1), + 's.nom'=>array('label'=>$langs->trans("ThirdParty"), 'checked'=>1), + 'commerical'=>array('label'=>$langs->trans("SaleRepresentative"), 'checked'=>1), + 'p.date_start'=>array('label'=>$langs->trans("DateStart"), 'checked'=>1, 'position'=>100), + 'p.date_end'=>array('label'=>$langs->trans("DateEnd"), 'checked'=>1, 'position'=>101), + 'p.visibility'=>array('label'=>$langs->trans("Visibility"), 'checked'=>1, 'position'=>102), + 'p.opportunity_amount'=>array('label'=>$langs->trans("OpportunityAmount"), 'checked'=>1, 'enabled'=>$conf->global->PROJECT_USE_OPPORTUNITIES, 'position'=>103), + 'p.opportunity_status'=>array('label'=>$langs->trans("OpportunityStatus"), 'checked'=>1, 'enabled'=>$conf->global->PROJECT_USE_OPPORTUNITIES, 'position'=>104), + 'p.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), + 'p.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), + 'p.status'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000), +); +// Extra fields +if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) +{ + foreach($extrafields->attribute_label as $key => $val) + { + $arrayfields["ef.".$key]=array('label'=>$extrafields->attribute_label[$key], 'checked'=>$extrafields->attribute_list[$key], 'position'=>$extrafields->attribute_pos[$key], 'enabled'=>$extrafields->attribute_perms[$key]); + } +} + + +/* + * Actions + */ + +include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; + +// Do we click on purge search criteria ? +if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers { $search_all=''; $search_ref=""; @@ -103,20 +153,9 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both $sday=""; $smonth=""; $syear=""; + $search_array_options=array(); } -// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array -$hookmanager->initHooks(array('projectlist')); -$extrafields = new ExtraFields($db); - -// List of fields to search into when doing a "search in all" -$fieldstosearchall = array( - 'p.ref'=>"Ref", - 'p.title'=>"Label", - 's.nom'=>"ThirdPartyName", - "p.note_public"=>"NotePublic" -); -if (empty($user->socid)) $fieldstosearchall["p.note_private"]="NotePrivate"; /* diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 8477eb97788..ef64761ab6f 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -634,14 +634,14 @@ if ($resql) if (! empty($arrayfields['s.town']['checked'])) { print '
'; } // Zip if (! empty($arrayfields['s.zip']['checked'])) { print ''; } // Country @@ -966,21 +966,21 @@ if ($resql) // Date creation if (! empty($arrayfields['s.datec']['checked'])) { - print ''; } // Date modification if (! empty($arrayfields['s.tms']['checked'])) { - print ''; } // Status if (! empty($arrayfields['s.status']['checked'])) { - print ''; + print ''; } // Action column print ''; From c664a492e631ace92ee325d1bf875ecf935c52bd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 3 Dec 2015 10:01:40 +0100 Subject: [PATCH 100/206] Removed a not used field making mysql error (reserved word). Also this field is not required by dolibarr core. --- htdocs/install/mysql/tables/llx_product.sql | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/htdocs/install/mysql/tables/llx_product.sql b/htdocs/install/mysql/tables/llx_product.sql index e34ae887ffc..3259fa360b9 100755 --- a/htdocs/install/mysql/tables/llx_product.sql +++ b/htdocs/install/mysql/tables/llx_product.sql @@ -31,7 +31,6 @@ create table llx_product datec datetime, tms timestamp, - virtual tinyint DEFAULT 0 NOT NULL, -- Not used. Used by external modules. Value 0 for physical product, 1 for virtual product fk_parent integer DEFAULT 0, -- Not used. Used by external modules. Virtual product id label varchar(255) NOT NULL, @@ -76,7 +75,7 @@ create table llx_product fifo double(24,8), -- To store valuation of stock calculated using fifo method, for this product lifo double(24,8), -- To store valuation of stock calculated using lifo method, for this product canvas varchar(32) DEFAULT NULL, - finished tinyint DEFAULT NULL, + finished tinyint DEFAULT NULL, -- 1=manufactured product, 0=matiere premiere hidden tinyint DEFAULT 0, -- Not used. Deprecated. import_key varchar(14), -- Import key fk_price_expression integer, -- Link to the rule for dynamic price calculation From cb8227f0861d7b7836fa233ed6acfb3fdb3e8b47 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 3 Dec 2015 10:04:13 +0100 Subject: [PATCH 101/206] Fix syntax error --- htdocs/core/class/extrafields.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index 6a397c1245f..399d148220c 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -1552,7 +1552,7 @@ class ExtraFields { $value_arr=GETPOST($keysuffix."options_".$key.$keyprefix); // Make sure we get an array even if there's only one checkbox - $value_arr=(array)$value_arr + $value_arr=(array) $value_arr; $value_key=implode(',', $value_arr); } else if (in_array($key_type,array('price','double'))) From 281eaf2987df657006059d1d24acf73fda0a1607 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Thu, 3 Dec 2015 10:27:23 +0100 Subject: [PATCH 102/206] FIX : Use "WHERE true" instead of "WHERE 1" #4132 --- htdocs/core/class/extrafields.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index 5d04b9c9317..8df0e0fcbc2 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -818,7 +818,7 @@ class ExtraFields } else { - $sqlwhere.= ' WHERE 1'; + $sqlwhere.= ' WHERE 1=1'; } if (in_array($InfoFieldList[0],array('tablewithentity'))) $sqlwhere.= ' AND entity = '.$conf->entity; // Some tables may have field, some other not. For the moment we disable it. $sql.=$sqlwhere; From 33e73afda6aaf1fd225e803cd4fcd24ec46a8412 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Thu, 3 Dec 2015 10:51:03 +0100 Subject: [PATCH 103/206] FIX : Cannot change the date of a contract #4088 --- htdocs/contrat/card.php | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 5ddb0b343fa..e0d08dbc1fa 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -830,7 +830,7 @@ if (empty($reshook)) setEventMessages($object->error, $object->errors, 'errors'); } - $result = $object->setValueFrom('ref',GETPOST('ref','alpha'));; + $result = $object->setValueFrom('ref',GETPOST('ref','alpha')); if ($result < 0) { setEventMessages($object->error, $object->errors, 'errors'); $action = 'editref'; @@ -843,6 +843,30 @@ if (empty($reshook)) header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $id); exit; } + } + elseif ($action=='setdate_contrat') + { + $cancelbutton = GETPOST('cancel'); + + if (!$cancelbutton) { + $result = $object->fetch($id); + if ($result < 0) { + setEventMessages($object->error, $object->errors, 'errors'); + } + $datacontrat=dol_mktime(GETPOST('date_contrathour'), GETPOST('date_contratmin'), 0, GETPOST('date_contratmonth'), GETPOST('date_contratday'), GETPOST('date_contratyear')); + $result = $object->setValueFrom('date_contrat',$datacontrat,'',null,'date'); + if ($result < 0) { + setEventMessages($object->error, $object->errors, 'errors'); + $action = 'editdate_contrat'; + } else { + header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $object->id); + exit; + } + } + else { + header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $id); + exit; + } } // Generation doc (depuis lien ou depuis cartouche doc) @@ -1278,8 +1302,15 @@ else print ""; // Date - print ''; - print '\n"; + print ''; + print ''; + print ''; + /* print ''; + print '\n";*/ // Projet if (! empty($conf->projet->enabled)) From b4160c7f81536d2f91afbfca528eac6f49017355 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Thu, 3 Dec 2015 10:58:06 +0100 Subject: [PATCH 104/206] Cannot change the date of a contract #4088 --- htdocs/comm/card.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php index a9164676716..7b2cee3b91d 100644 --- a/htdocs/comm/card.php +++ b/htdocs/comm/card.php @@ -762,7 +762,7 @@ if ($id > 0) { $contratstatic=new Contrat($db); - $sql = "SELECT s.nom, s.rowid, c.rowid as id, c.ref as ref, c.statut, c.datec as dc"; + $sql = "SELECT s.nom, s.rowid, c.rowid as id, c.ref as ref, c.statut, c.datec as dc, c.date_contrat as dcon"; $sql.= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."contrat as c"; $sql.= " WHERE c.fk_soc = s.rowid "; $sql.= " AND s.rowid = ".$object->id; @@ -779,7 +779,7 @@ if ($id > 0) print '
'; - print ''; + print ''; print ''; - print ''; + print ''; print ''; + print ''; print dol_print_date($db->jdate($obj->date_creation), 'dayhour'); print ''; + print ''; print dol_print_date($db->jdate($obj->date_update), 'dayhour'); print ''.$companystatic->getLibStatut(3).''.$companystatic->getLibStatut(3).'
'.$langs->trans("Date").''.dol_print_date($object->date_contrat,"dayhour")."
'; + print $form->editfieldkey("Date",'date_contrat',$object->date_contrat,$object,$user->rights->contrat->creer); + print ''; + print $form->editfieldval("Date",'date_contrat',$object->date_contrat,$object,$user->rights->contrat->creer,'datehourpicker'); + print '
'.$langs->trans("Date").''.dol_print_date($object->date_contrat,"dayhour")."
'; print ''; - print ''; print ''; @@ -1837,7 +1837,7 @@ if ($action == 'create') if ($action != 'editavailability' && ! empty($object->brouillon)) print ''; print '
'; + print ''; print ''; } @@ -797,6 +797,7 @@ if ($id > 0) print $contrat->getNomUrl(1,12); print "\n"; print '\n"; + print '\n"; print ''; print ''; print '
'.$langs->trans("LastContracts",($num<=$MAXLIST?"":$MAXLIST)).''; print '
'.$langs->trans("LastContracts",($num<=$MAXLIST?"":$MAXLIST)).''.$langs->trans("AllContracts").' '.$num.'
'.dol_print_date($db->jdate($objp->dc),'day')."'.dol_print_date($db->jdate($objp->dcon),'day')." '; $contrat->fetch_lines(); From ee08c4afc4ee134683638fbc2e8c11b401850f03 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Thu, 3 Dec 2015 11:03:40 +0100 Subject: [PATCH 105/206] Display the ref_supplier inside the contract list of /comm/card.php #4090 --- htdocs/comm/card.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php index 7b2cee3b91d..e5615aa66ba 100644 --- a/htdocs/comm/card.php +++ b/htdocs/comm/card.php @@ -762,7 +762,7 @@ if ($id > 0) { $contratstatic=new Contrat($db); - $sql = "SELECT s.nom, s.rowid, c.rowid as id, c.ref as ref, c.statut, c.datec as dc, c.date_contrat as dcon"; + $sql = "SELECT s.nom, s.rowid, c.rowid as id, c.ref as ref, c.statut, c.datec as dc, c.date_contrat as dcon, c.ref_supplier as refsup"; $sql.= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."contrat as c"; $sql.= " WHERE c.fk_soc = s.rowid "; $sql.= " AND s.rowid = ".$object->id; @@ -779,7 +779,7 @@ if ($id > 0) print ''; print ''; - print ''; print '
'; + print ''; print ''; } @@ -796,6 +796,7 @@ if ($id > 0) $contrat->ref=$objp->ref?$objp->ref:$objp->id; print $contrat->getNomUrl(1,12); print "\n"; + print '\n"; print '\n"; print '\n"; print ''; From 10a925f7b4f0625b8c1353c44140588ee4794f47 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Thu, 3 Dec 2015 11:52:41 +0100 Subject: [PATCH 106/206] FIX: WHERE 1=1 --- htdocs/core/class/extrafields.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index 8df0e0fcbc2..5f3caf18369 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -986,7 +986,7 @@ class ExtraFields $sqlwhere .= ' WHERE ' . $InfoFieldList[4]; } } else { - $sqlwhere .= ' WHERE 1'; + $sqlwhere .= ' WHERE 1=1'; } if (in_array($InfoFieldList[0], array ( 'tablewithentity' From a7d03af4afdbd2cfe8bd3990ce98e9f9d330b0b4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 3 Dec 2015 12:47:21 +0100 Subject: [PATCH 107/206] Fix sending emails from mergepedtool was just doing wrong things. --- htdocs/compta/facture/mergepdftool.php | 365 +++++++++++++++++-------- 1 file changed, 254 insertions(+), 111 deletions(-) diff --git a/htdocs/compta/facture/mergepdftool.php b/htdocs/compta/facture/mergepdftool.php index ea0eedfa36a..b84dd1a62c6 100644 --- a/htdocs/compta/facture/mergepdftool.php +++ b/htdocs/compta/facture/mergepdftool.php @@ -70,6 +70,11 @@ $diroutputpdf=$conf->facture->dir_output . '/unpaid/temp'; if (! $user->rights->societe->client->voir || $socid) $diroutputpdf.='/private/'.$user->id; // If user has no permission to see all, output dir is specific to user $resultmasssend=''; +if (GETPOST('buttonsendremind')) +{ + $action='presend'; + $mode='sendmassremind'; +} if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test must be present to be compatible with all browsers { @@ -122,15 +127,90 @@ if ($action == 'presend' && GETPOST('sendmail')) $nbsent = 0; $nbignored = 0; - for ($i = 0; $i < $countToSend; $i++) + $arrayofinvoices=GETPOST('toSend','array'); + + $thirdparty=new Societe($db); + $invoicetmp=new Facture($db); + $listofinvoicesid=array(); + $listofinvoicesthirdparties=array(); + $listofinvoicesref=array(); + foreach($arrayofinvoices as $invoiceid) { - $object = new Facture($db); - $result = $object->fetch($_POST['toSend'][$i]); - - if ($result > 0) // Invoice was found + $invoicetmp=new Facture($db); // must create new instance because instance is saved into $listofinvoicesref array for future use + $result=$invoicetmp->fetch($invoiceid); + if ($result > 0) { + $listoinvoicesid[$invoiceid]=$invoiceid; + $thirdpartyid=$invoicetmp->fk_soc?$invoicetmp->fk_soc:$invoicetmp->socid; + $listofinvoicesthirdparties[$thirdpartyid]=$thirdpartyid; + $listofinvoicesref[$thirdpartyid][$invoiceid]=$invoicetmp; + } + } + //var_dump($listofinvoicesref);exit; + + foreach ($listofinvoicesthirdparties as $thirdpartyid) + { + $result = $thirdparty->fetch($thirdpartyid); + if ($result < 0) + { + dol_print_error($db); + exit; + } + + // Define recipient $sendto and $sendtocc + if (trim($_POST['sendto'])) + { + // Recipient is provided into free text + $sendto = trim($_POST['sendto']); + $sendtoid = 0; + } + elseif ($_POST['receiver'] != '-1') + { + // Recipient was provided from combo list + if ($_POST['receiver'] == 'thirdparty') // Id of third party + { + $sendto = $thirdparty->email; + $sendtoid = 0; + } + else // Id du contact + { + $sendto = $thirdparty->contact_get_property((int) $_POST['receiver'],'email'); + $sendtoid = $_POST['receiver']; + } + } + if (trim($_POST['sendtocc'])) + { + $sendtocc = trim($_POST['sendtocc']); + } + elseif ($_POST['receivercc'] != '-1') + { + // Recipient was provided from combo list + if ($_POST['receivercc'] == 'thirdparty') // Id of third party + { + $sendtocc = $thirdparty->email; + } + else // Id du contact + { + $sendtocc = $thirdparty->contact_get_property((int) $_POST['receivercc'],'email'); + } + } + + //var_dump($listofinvoicesref[$thirdpartyid]); + + $attachedfiles=array('paths'=>array(), 'names'=>array(), 'mimes'=>array()); + $listofqualifiedinvoice=array(); + $listofqualifiedref=array(); + foreach($listofinvoicesref[$thirdpartyid] as $invoiceid => $invoice) + { + //var_dump($invoice); + $object = $invoice; + //$object = new Facture($db); + //$result = $object->fetch(); + //var_dump($thirdpartyid.' - '.$invoiceid.' - '.$object->statut); + if ($object->statut != Facture::STATUS_VALIDATED) { + $nbignored++; continue; // Payment done or started or canceled } @@ -144,108 +224,30 @@ if ($action == 'presend' && GETPOST('sendmail')) if (dol_is_file($file)) { - $object->fetch_thirdparty(); - $sendto = $object->thirdparty->email; + if (empty($sendto)) // For the case, no recipient were set (multi thirdparties send) + { + $object->fetch_thirdparty(); + $sendto = $object->thirdparty->email; + } - if (empty($sendto)) $nbignored++; + if (empty($sendto)) + { + $nbignored++; + continue; + } if (dol_strlen($sendto)) { - $langs->load("commercial"); - $from = $user->getFullName($langs) . ' <' . $user->email .'>'; - $replyto = $from; - $subject = GETPOST('subject'); - $message = GETPOST('message'); - $sendtocc = GETPOST('sentocc'); - $sendtobcc = (empty($conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO)?'':$conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO); - - $substitutionarray=array( - '__ID__' => $object->id, - '__EMAIL__' => $object->thirdparty->email, - '__CHECK_READ__' => '', - //'__LASTNAME__' => $obj2->lastname, - //'__FIRSTNAME__' => $obj2->firstname, - '__FACREF__' => $object->ref, // For backward compatibility - '__REF__' => $object->ref, - '__REFCLIENT__' => $object->thirdparty->name - ); - - $subject=make_substitutions($subject, $substitutionarray); - $message=make_substitutions($message, $substitutionarray); - - $actiontypecode='AC_FAC'; - $actionmsg=$langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto; - if ($message) - { - if ($sendtocc) $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc); - $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subject); - $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":"); - $actionmsg = dol_concatdesc($actionmsg, $message); - } - // Create form object - $attachedfiles=array('paths'=>array($file), 'names'=>array($filename), 'mimes'=>array($mime)); - $filepath = $attachedfiles['paths']; - $filename = $attachedfiles['names']; - $mimetype = $attachedfiles['mimes']; - - // Send mail - require_once(DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'); - $mailfile = new CMailFile($subject,$sendto,$from,$message,$filepath,$mimetype,$filename,$sendtocc,$sendtobcc,$deliveryreceipt,-1); - if ($mailfile->error) - { - $resultmasssend.='
'.$mailfile->error.'
'; - } - else - { - $result=$mailfile->sendfile(); - if ($result) - { - $resultmasssend.=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($from,2),$mailfile->getValidAddress($sendto,2)); // Must not contain " - - $error=0; - - // Initialisation donnees - $object->sendtoid = 0; - $object->actiontypecode = $actiontypecode; - $object->actionmsg = $actionmsg; // Long text - $object->actionmsg2 = $actionmsg2; // Short text - $object->fk_element = $object->id; - $object->elementtype = $object->element; - - // Appel des triggers - include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php"); - $interface=new Interfaces($db); - $result=$interface->run_triggers('BILL_SENTBYMAIL',$object,$user,$langs,$conf); - if ($result < 0) { $error++; $this->errors=$interface->errors; } - // Fin appel triggers - - if (! $error) - { - $resultmasssend.=$langs->trans("MailSent").': '.$sendto."
\n"; - } - else - { - dol_print_error($db); - } - $nbsent++; - - } - else - { - $langs->load("other"); - if ($mailfile->error) - { - $resultmasssend.=$langs->trans('ErrorFailedToSendMail',$from,$sendto); - $resultmasssend.='
'.$mailfile->error.'
'; - } - else - { - $resultmasssend.='
No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS
'; - } - } - } + $attachedfiles=array( + 'paths'=>array_merge($attachedfiles['paths'],array($file)), + 'names'=>array_merge($attachedfiles['names'],array($filename)), + 'mimes'=>array_merge($attachedfiles['mimes'],array($mime)) + ); } + + $listofqualifiedinvoice[$invoiceid]=$invoice; + $listofqualifiedref[$invoiceid]=$invoice->ref; } else { @@ -253,6 +255,109 @@ if ($action == 'presend' && GETPOST('sendmail')) $langs->load("other"); $resultmasssend.='
'.$langs->trans('ErrorCantReadFile',$file).'
'; dol_syslog('Failed to read file: '.$file, LOG_WARNING); + continue; + } + + //var_dump($listofqualifiedref); + } + + if (count($listofqualifiedinvoice) > 0) + { + $langs->load("commercial"); + $from = $user->getFullName($langs) . ' <' . $user->email .'>'; + $replyto = $from; + $subject = GETPOST('subject'); + $message = GETPOST('message'); + $sendtocc = GETPOST('sentocc'); + $sendtobcc = (empty($conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO)?'':$conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO); + + $substitutionarray=array( + '__ID__' => join(', ',array_keys($listofqualifiedinvoice)), + '__EMAIL__' => $thirdparty->email, + '__CHECK_READ__' => '', + //'__LASTNAME__' => $obj2->lastname, + //'__FIRSTNAME__' => $obj2->firstname, + '__FACREF__' => join(', ',$listofqualifiedref), // For backward compatibility + '__REF__' => join(', ',$listofqualifiedref), + '__REFCLIENT__' => $thirdparty->name + ); + + $subject=make_substitutions($subject, $substitutionarray); + $message=make_substitutions($message, $substitutionarray); + + $filepath = $attachedfiles['paths']; + $filename = $attachedfiles['names']; + $mimetype = $attachedfiles['mimes']; + + //var_dump($filepath); + + // Send mail + require_once(DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'); + $mailfile = new CMailFile($subject,$sendto,$from,$message,$filepath,$mimetype,$filename,$sendtocc,$sendtobcc,$deliveryreceipt,-1); + if ($mailfile->error) + { + $resultmasssend.='
'.$mailfile->error.'
'; + } + else + { + $result=$mailfile->sendfile(); + if ($result) + { + $resultmasssend.=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($from,2),$mailfile->getValidAddress($sendto,2)); // Must not contain " + + $error=0; + + foreach($listofqualifiedinvoice as $invid => $object) + { + $actiontypecode='AC_FAC'; + $actionmsg=$langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto; + if ($message) + { + if ($sendtocc) $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc); + $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subject); + $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":"); + $actionmsg = dol_concatdesc($actionmsg, $message); + } + + // Initialisation donnees + $object->sendtoid = 0; + $object->actiontypecode = $actiontypecode; + $object->actionmsg = $actionmsg; // Long text + $object->actionmsg2 = $actionmsg2; // Short text + $object->fk_element = $invid; + $object->elementtype = $invoice->element; + + // Appel des triggers + include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php"); + $interface=new Interfaces($db); + $result=$interface->run_triggers('BILL_SENTBYMAIL',$object,$user,$langs,$conf); + if ($result < 0) { $error++; $this->errors=$interface->errors; } + // Fin appel triggers + + if (! $error) + { + $resultmasssend.=$langs->trans("MailSent").': '.$sendto."
\n"; + } + else + { + dol_print_error($db); + } + $nbsent++; + } + } + else + { + $langs->load("other"); + if ($mailfile->error) + { + $resultmasssend.=$langs->trans('ErrorFailedToSendMail',$from,$sendto); + $resultmasssend.='
'.$mailfile->error.'
'; + } + else + { + $resultmasssend.='
No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS
'; + } + } } } } @@ -417,7 +522,6 @@ $search_societe = GETPOST("search_societe"); $search_paymentmode = GETPOST("search_paymentmode"); $search_montant_ht = GETPOST("search_montant_ht"); $search_montant_ttc = GETPOST("search_montant_ttc"); -$search_status = GETPOST("search_status"); $late = GETPOST("late"); // Do we click on purge search criteria ? @@ -429,7 +533,6 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both $search_paymentmode=''; $search_montant_ht=''; $search_montant_ttc=''; - $search_status=''; } $sortfield = GETPOST("sortfield",'alpha'); @@ -485,7 +588,6 @@ if ($search_paymentmode) $sql .= " AND f.fk_mode_reglement = ".$search_paymentmo if ($search_montant_ht) $sql .= " AND f.total = '".$db->escape($search_montant_ht)."'"; if ($search_montant_ttc) $sql .= " AND f.total_ttc = '".$db->escape($search_montant_ttc)."'"; if (GETPOST('sf_ref')) $sql .= " AND f.facnumber LIKE '%".$db->escape(GETPOST('sf_ref'))."%'"; -if ($search_status) $sql .= " AND f.fk_statut = ".$search_status; if ($month > 0) { if ($year > 0) @@ -531,7 +633,6 @@ if ($resql) if ($search_societe) $param.='&search_paymentmode='.urlencode($search_paymentmode); if ($search_montant_ht) $param.='&search_montant_ht='.urlencode($search_montant_ht); if ($search_montant_ttc) $param.='&search_montant_ttc='.urlencode($search_montant_ttc); - if ($search_status) $param.='&search_status='.urlencode($search_status); if ($late) $param.='&late='.urlencode($late); if ($mode) $param.='&mode='.urlencode($mode); $urlsource=$_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder; @@ -551,6 +652,31 @@ if ($resql) print_fiche_titre($titre,$link); //print_barre_liste($titre,$page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',0); // We don't want pagination on this page + $arrayofinvoices=GETPOST('toSend','array'); + if ($action == 'presend' && count($arrayofinvoices) == 0 && ! GETPOST('cancel')) + { + setEventMessages($langs->trans("InvoiceNotChecked"), null, 'errors'); + $action='list'; + $mode='sendmassremind'; + } + else + { + $invoicetmp=new Facture($db); + $listofinvoicesid=array(); + $listofinvoicesthirdparties=array(); + $listofinvoicesref=array(); + foreach($arrayofinvoices as $invoiceid) + { + $result=$invoicetmp->fetch($invoiceid); + if ($result > 0) + { + $listofinvoicesid[$invoiceid]=$invoiceid; + $thirdpartyid=$invoicetmp->fk_soc?$invoicetmp->fk_soc:$invoicetmp->socid; + $listofinvoicesthirdparties[$thirdpartyid]=$thirdpartyid; + $listofinvoicesref[$thirdpartyid][$invoiceid]=$invoicetmp->ref; + } + } + } print ''; if (GETPOST('modelselected')) { @@ -575,10 +701,25 @@ if ($resql) $formmail->fromname = $user->getFullName($langs); $formmail->frommail = $user->email; $formmail->withfrom=1; - $liste=array(); - $formmail->withto=$langs->trans("AllRecipientSelectedForRemind"); + $liste=$langs->trans("AllRecipientSelectedForRemind"); + if (count($listofinvoicesthirdparties) == 1) + { + $liste=array(); + $thirdpartyid=array_shift($listofinvoicesthirdparties); + $soc=new Societe($db); + $soc->fetch($thirdpartyid); + foreach ($soc->thirdparty_and_contact_email_array(1) as $key=>$value) + { + $liste[$key]=$value; + } + $formmail->withtoreadonly=0; + } + else + { + $formmail->withtoreadonly=1; + } + $formmail->withto=$liste; $formmail->withtofree=0; - $formmail->withtoreadonly=1; $formmail->withtocc=1; $formmail->withtoccc=$conf->global->MAIN_EMAIL_USECCC; $formmail->withtopic=$langs->transnoentities($topicmail, '__FACREF__', '__REFCLIENT__'); @@ -597,7 +738,7 @@ if ($resql) $formmail->param['action']=$action; $formmail->param['models']=$modelmail; $formmail->param['models_id']=GETPOST('modelmailselected','int'); - $formmail->param['facid']=$object->id; + $formmail->param['facid']=join(',',$arrayofinvoices); $formmail->param['returnurl']=$_SERVER["PHP_SELF"].'?id='.$object->id; print $formmail->get_form(); @@ -822,7 +963,9 @@ if ($resql) { // Checkbox to send remind print '
' ; } @@ -869,7 +1012,7 @@ if ($resql) if ($action != 'presend') { print '
'; - print ''.$langs->trans("SendRemind").''; + print ''; print '
'; print '
'; } From eb98bd1e788ea181448244e42f7825abc50fdaa2 Mon Sep 17 00:00:00 2001 From: fmarcet Date: Thu, 3 Dec 2015 14:02:26 +0100 Subject: [PATCH 108/206] FIX: Not delete a product when have customer price --- htdocs/product/class/product.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 41c73a227a4..22dde9accc7 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -806,7 +806,7 @@ class Product extends CommonObject } // Delete all child tables - $elements = array('product_fournisseur_price','product_price','product_lang','categorie_product','product_stock'); + $elements = array('product_fournisseur_price','product_price','product_lang','categorie_product','product_stock','product_customer_price'); foreach($elements as $table) { if (! $error) From e4f0b9ba156046d55bd21c1bb51a901db99c3131 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 3 Dec 2015 14:46:34 +0100 Subject: [PATCH 109/206] Fix detection of last version on sourceforge --- htdocs/admin/tools/update.php | 41 +++++++++++++++-------------------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/htdocs/admin/tools/update.php b/htdocs/admin/tools/update.php index e1166e96c3d..f524508e708 100644 --- a/htdocs/admin/tools/update.php +++ b/htdocs/admin/tools/update.php @@ -23,6 +23,7 @@ */ require '../../main.inc.php'; +include_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; include_once DOL_DOCUMENT_ROOT . '/core/lib/geturl.lib.php'; @@ -172,30 +173,22 @@ $result = getURLContent('http://sourceforge.net/projects/dolibarr/rss'); $sfurl = simplexml_load_string($result['content']); if ($sfurl) { - $title=$sfurl->channel[0]->item[0]->title; - - function word_limiter($text, $limit = 30, $chars = '0123456789.') - { - if (strlen( $text ) > $limit) - { - $words = str_word_count($text, 2, $chars); - $words = array_reverse($words, TRUE); - foreach($words as $length => $word) { - if ($length + strlen( $word ) >= $limit) - { - array_shift($words); - } else { - break; - } - } - $words = array_reverse($words); - $text = implode(" ", $words) . ''; - } - return $text; - } - - $str = $title; - print $langs->trans("LastStableVersion").' : '. word_limiter( $str ).'
'; + $i=0; + $version='0.0'; + while (! empty($sfurl->channel[0]->item[$i]->title) && $i < 10000) + { + $title=$sfurl->channel[0]->item[$i]->title; + if (preg_match('/([0-9]+\.([0-9\.]+))/', $title, $reg)) + { + $newversion=$reg[1]; + $newversionarray=explode('.',$newversion); + $versionarray=explode('.',$version); + //var_dump($newversionarray);var_dump($versionarray); + if (versioncompare($newversionarray, $versionarray) > 0) $version=$newversion; + } + $i++; + } + print $langs->trans("LastStableVersion").' : '. ($version?$version:$langs->trans("Unknown")) .'
'; } else { From 6be9a04a5648d5bd1f7a4d221cae423660e963db Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 3 Dec 2015 14:52:13 +0100 Subject: [PATCH 110/206] Fix detection of last version on sourceforge --- htdocs/admin/system/about.php | 60 +++++++++++++++++------------------ htdocs/admin/tools/update.php | 4 ++- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/htdocs/admin/system/about.php b/htdocs/admin/system/about.php index e9d3f96ad55..3b2492fad65 100644 --- a/htdocs/admin/system/about.php +++ b/htdocs/admin/system/about.php @@ -59,39 +59,39 @@ $result = getURLContent('http://sourceforge.net/projects/dolibarr/rss'); $sfurl = simplexml_load_string($result['content']); if ($sfurl) { - $title=$sfurl->channel[0]->item[0]->title; + $i=0; + $version='0.0'; + while (! empty($sfurl->channel[0]->item[$i]->title) && $i < 10000) + { + $title=$sfurl->channel[0]->item[$i]->title; + if (preg_match('/([0-9]+\.([0-9\.]+))/', $title, $reg)) + { + $newversion=$reg[1]; + $newversionarray=explode('.',$newversion); + $versionarray=explode('.',$version); + //var_dump($newversionarray);var_dump($versionarray); + if (versioncompare($newversionarray, $versionarray) > 0) $version=$newversion; + } + $i++; + } - function word_limiter($text, $limit = 30, $chars = '0123456789.') - { - if (strlen( $text ) > $limit) - { - $words = str_word_count($text, 2, $chars); - $words = array_reverse($words, TRUE); - foreach($words as $length => $word) { - if ($length + strlen( $word ) >= $limit) - { - array_shift($words); - } else { - break; - } - } - $words = array_reverse($words); - $text = implode(" ", $words) . ''; - } - return $text; - } - - $str = word_limiter($title); - $str = preg_replace('/[^0-9\.]/', '', $str); - print ' ('.$langs->trans("LastStableVersion").': '.$str.''; - if (DOL_VERSION == $str) - { - $youuselaststable=1; - print $langs->trans("YouUseLastStableVersion"); - } - print ')'; + // Show version + if ($version != '0.0') + { + print ' ('.$langs->trans("LastStableVersion").': '.$version.''; + if (DOL_VERSION == $version) + { + $youuselaststable=1; + print $langs->trans("YouUseLastStableVersion"); + } + print ')'; + } print ' / GNU-GPL v3+'; } +else +{ + print $langs->trans("LastStableVersion").' : ' .$langs->trans("UpdateServerOffline").'
'; +} print ''; diff --git a/htdocs/admin/tools/update.php b/htdocs/admin/tools/update.php index f524508e708..cb4890f77f1 100644 --- a/htdocs/admin/tools/update.php +++ b/htdocs/admin/tools/update.php @@ -188,7 +188,9 @@ if ($sfurl) } $i++; } - print $langs->trans("LastStableVersion").' : '. ($version?$version:$langs->trans("Unknown")) .'
'; + + // Show version + print $langs->trans("LastStableVersion").' : '. (($version != '0.0')?$version:$langs->trans("Unknown")) .'
'; } else { From 43ab23ca28161ad87ccd3e5bbc32ab05444c625a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 3 Dec 2015 14:54:39 +0100 Subject: [PATCH 111/206] Fix doxygen --- htdocs/core/class/html.form.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 541ea766076..18580c4b6cc 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -485,9 +485,9 @@ class Form /** * Generate select HTML to choose massaction * - * @parama string $selected Selected value + * @param string $selected Selected value * @param int $arrayofaction array('code'=>'label', ...) - * @param string Select list + * @return string Select list */ function selectMassAction($selected, $arrayofaction) { From fb692f4cd50baae47edda578f1a50351d25d1ff1 Mon Sep 17 00:00:00 2001 From: Bahfir Abbes Date: Thu, 3 Dec 2015 19:10:15 +0100 Subject: [PATCH 112/206] Update card.php --- htdocs/fichinter/card.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/fichinter/card.php b/htdocs/fichinter/card.php index 33c2e48b599..403f1411dc8 100644 --- a/htdocs/fichinter/card.php +++ b/htdocs/fichinter/card.php @@ -467,7 +467,7 @@ if (empty($reshook)) // Add line else if ($action == "addline" && $user->rights->ficheinter->creer) { - if (!GETPOST('np_desc') && $conf->global->FICHINTER_EMPTY_LINE_DESC!=1 ) + if (!GETPOST('np_desc') && empty($conf->global->FICHINTER_EMPTY_LINE_DESC) ) { $mesg='
'.$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Description")).'
'; $error++; @@ -1570,7 +1570,7 @@ else if ($id > 0 || ! empty($ref)) print '
\n"; print ''; print ''; - + if (! in_array('plannedworkload', $hiddenfields)) + { + print ''; + } if (! in_array('declaredprogress', $hiddenfields)) { $declaredprogressworkload=$objp->declared_progess_workload; @@ -1078,7 +1080,7 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks= if (empty($conf->global->PROJECT_HIDE_TASKS)) { print ''; - print ''; + if (! in_array('plannedworkload', $hiddenfields)) print ''; if (! in_array('declaredprogress', $hiddenfields)) print ''; } print ''; diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index d173282fdb9..d27df85f4ac 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1749,9 +1749,9 @@ function left_menu($menu_array_before, $helppagename='', $notused='', $menu_arra $bugbaseurl.= urlencode("- **URL**: " . $_SERVER["REQUEST_URI"] . "\n"); $bugbaseurl.= urlencode("\n"); $bugbaseurl.= urlencode("# Report\n"); - print '

'; + print '

'; print ''.$langs->trans("FindBug").''; - print '

'; + print '
'; } print "\n"; diff --git a/htdocs/projet/index.php b/htdocs/projet/index.php index b91b8763611..8b3d2b76c25 100644 --- a/htdocs/projet/index.php +++ b/htdocs/projet/index.php @@ -132,7 +132,7 @@ include DOL_DOCUMENT_ROOT.'/projet/graph_opportunities.inc.php'; // List of draft projects -print_projecttasks_array($db,$form,$socid,$projectsListId,0,0,$listofoppstatus,array('declaredprogress')); +print_projecttasks_array($db, $form, $socid, $projectsListId, 0, 0, $listofoppstatus, array('projectlabel', 'plannedworkload', 'declaredprogress')); print '
'; diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 360cd3631e8..f0f031114e5 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -190,6 +190,10 @@ $colortexttitle=join(',',colorStringToArray($colortexttitle)); $colortext=join(',',colorStringToArray($colortext)); $colortextlink=join(',',colorStringToArray($colortextlink)); +if (! empty($conf->dol_optimize_smallscreen)) $fontsize=11; + +$nbtopmenuentries=$menumanager->showmenu('topnb'); + print '/*'."\n"; print 'colorbackbody='.$colorbackbody."\n"; print 'colorbackvmenu1='.$colorbackvmenu1."\n"; @@ -211,14 +215,9 @@ print 'dol_use_jmobile='.$dol_use_jmobile."\n"; print 'dol_screenwidth='.$_SESSION['dol_screenwidth']."\n"; print 'dol_screenheight='.$_SESSION['dol_screenheight']."\n"; print 'fontsize='.$fontsize."\n"; +print 'nbtopmenuentries='.$nbtopmenuentries."\n"; print '*/'."\n"; -if (! empty($conf->dol_optimize_smallscreen)) $fontsize=11; - - -$nbtopmenuentries=$menumanager->showmenu('topnb'); -//print $nb; - ?> /* ============================================================================== */ @@ -2455,7 +2454,7 @@ input.liste_titre { } .noborder tr.liste_total, .noborder tr.liste_total td, tr.liste_total, form.liste_total { - background: #F0F0F0; + /* background: #F0F0F0; */ } .noborder tr.liste_total td, tr.liste_total td, form.liste_total div { color: #552266; diff --git a/htdocs/theme/md/graph-color.php b/htdocs/theme/md/graph-color.php index 0c091a1ede3..4346d007158 100644 --- a/htdocs/theme/md/graph-color.php +++ b/htdocs/theme/md/graph-color.php @@ -28,7 +28,7 @@ global $theme_bordercolor, $theme_datacolor, $theme_bgcolor, $theme_bgcoloronglet; $theme_bordercolor = array(235,235,224); -$theme_datacolor = array(array(190,190,220), array(200,160,180), array(125,135,150), array(170,140,190), array(190,190,170), array(190,170,190), array(170,190,190), array(150,135,125), array(85,135,150), array(150,135,80), array(150,80,150)); +$theme_datacolor = array(array(140,140,220), array(190,120,120), array(0,160,140), array(190,190,100), array(115,125,150), array(100,170,20), array(250,190,30), array(150,135,125), array(85,135,150), array(150,135,80), array(150,80,150)); $theme_bgcolor = array(hexdec('F4'),hexdec('F4'),hexdec('F4')); $theme_bgcoloronglet = array(hexdec('DE'),hexdec('E7'),hexdec('EC')); diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 6dae9fd3e9c..cac83da19b9 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -185,6 +185,10 @@ $colortexttitle=join(',',colorStringToArray($colortexttitle)); $colortext=join(',',colorStringToArray($colortext)); $colortextlink=join(',',colorStringToArray($colortextlink)); +if (! empty($conf->dol_optimize_smallscreen)) $fontsize=11; + +$nbtopmenuentries=$menumanager->showmenu('topnb'); + print '/*'."\n"; print 'colorbackbody='.$colorbackbody."\n"; print 'colorbackvmenu1='.$colorbackvmenu1."\n"; @@ -205,12 +209,9 @@ print 'dol_no_mouse_hover='.$dol_no_mouse_hover."\n"; print 'dol_use_jmobile='.$dol_use_jmobile."\n"; print 'dol_screenwidth='.$_SESSION['dol_screenwidth']."\n"; print 'dol_screenheight='.$_SESSION['dol_screenheight']."\n"; +print 'nbtopmenuentries='.$nbtopmenuentries."\n"; print '*/'."\n"; -if (! empty($conf->dol_optimize_smallscreen)) $fontsize=11; - -$nbtopmenuentries=$menumanager->showmenu('topnb'); - ?> /* ============================================================================== */ @@ -1933,11 +1934,11 @@ table.liste, table.noborder, table.formdoc, div.noborder { border-style: solid; margin: 0px 0px 2px 0px; - + /* -moz-box-shadow: 2px 2px 4px #CCC; -webkit-box-shadow: 2px 2px 4px #CCC; box-shadow: 2px 2px 4px #CCC; - + */ -moz-border-radius: 0.1em; -webkit-border-radius: 0.1em; border-radius: 0.1em; @@ -1953,14 +1954,14 @@ table.noborder tr, div.noborder form { border-left-width: 1px; border-left-color: #BBBBBB; border-left-style: solid; - height: 26px; + min-height: 26px; } table.liste th, table.noborder th { padding: 5px 2px 5px 3px; /* t r b l */ } table.noborder th, table.noborder td, div.noborder form, div.noborder form div { - padding: 1px 2px 1px 3px; /* t r b l */ + padding: 4px 2px 4px 3px; /* t r b l */ } table.nobordernopadding { @@ -2211,7 +2212,7 @@ table.dataTable td { } tr.even td, tr.pair td, tr.odd td, tr.impair td, form.odd div.tagtd, form.impair div.tagtd, form.pair div.tagtd, div.impair div.tagtd, div.pair div.tagtd, div.liste_titre div.tagtd { padding: 5px 2px 5px 3px; - border-bottom: 1px solid #f4f4f4; + border-bottom: 1px solid #eee; } tr.even td .nobordernopadding tr td, tr.pair td .nobordernopadding tr td, tr.impair td .nobordernopadding tr td, tr.odd td .nobordernopadding tr td { border-bottom: 0px !important; @@ -2309,14 +2310,15 @@ input.liste_titre { } .noborder tr.liste_total, .noborder tr.liste_total td, tr.liste_total, form.liste_total { - background: #F0F0F0; + /* background: #F0F0F0; */ } .noborder tr.liste_total td, tr.liste_total td, form.liste_total div { - border-top: 1px solid #f4f4f4; + /* border-top: 1px solid #f4f4f4; */ color: #332266; font-weight: normal; white-space: nowrap; padding: 4px; + height: 20px; } @@ -3734,7 +3736,23 @@ border-top-right-radius: 6px; -/* CSS style used for small screen */ +::-webkit-scrollbar { + width: 10px; +} +::-webkit-scrollbar-button { + background: #aaa +} +::-webkit-scrollbar-track-piece { + background: #fff +} +::-webkit-scrollbar-thumb { + background: #ddd +}​ + + + + +/***** CSS style used for small screen *****/ .imgopensurveywizard { @@ -3750,7 +3768,7 @@ border-top-right-radius: 6px; } } -@media only screen and (max-width: px) +@media only screen and (max-width: px) { .mainmenuaspan { display: none; From e6ebc9c2937f59aa9f5c77db0b82bb7520efc635 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 4 Dec 2015 12:24:36 +0100 Subject: [PATCH 117/206] More complete tooltip help --- htdocs/core/lib/project.lib.php | 2 +- htdocs/langs/fr_FR/projects.lang | 1 + htdocs/theme/md/style.css.php | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 5eeb13ca937..97bea63e436 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -1075,7 +1075,7 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks= if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { print '
'; - print ''; + print ''; } if (empty($conf->global->PROJECT_HIDE_TASKS)) { diff --git a/htdocs/langs/fr_FR/projects.lang b/htdocs/langs/fr_FR/projects.lang index 97f36381257..256e1bc4129 100644 --- a/htdocs/langs/fr_FR/projects.lang +++ b/htdocs/langs/fr_FR/projects.lang @@ -178,6 +178,7 @@ TaskAssignedToEnterTime=Tâche assignée. La saisie de temps sur cette tâche de OpenedProjectsByThirdparties=Projets ouverts par tiers OpportunityTotalAmount=Montant total des opportunités OpportunityPonderatedAmount=Montant pondéré des opportunités +OpportunityPonderatedAmountDesc=Montant pondéré par la probabilité (dépendante du statut) des opportunités OppStatusPROSP=Prospection OppStatusQUAL=Qualification OppStatusPROPO=Proposition diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index cac83da19b9..261a288ddc3 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -2214,6 +2214,9 @@ tr.even td, tr.pair td, tr.odd td, tr.impair td, form.odd div.tagtd, form.impair padding: 5px 2px 5px 3px; border-bottom: 1px solid #eee; } +tr.even:last-child td, tr.pair:last-child td, tr.odd:last-child td, tr.impair:last-child td { + border-bottom: 0px !important; +} tr.even td .nobordernopadding tr td, tr.pair td .nobordernopadding tr td, tr.impair td .nobordernopadding tr td, tr.odd td .nobordernopadding tr td { border-bottom: 0px !important; } From 6598ac67457f182cddb9914b5ab279240cd17a94 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Fri, 4 Dec 2015 12:48:36 +0100 Subject: [PATCH 118/206] Add rights to see tab (hrm->employee->read) --- htdocs/core/lib/usergroups.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index e8961645c62..5083ec3b495 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -94,7 +94,7 @@ function user_prepare_head($object) // $this->tabs = array('entity:-tabname); to remove a tab complete_head_from_modules($conf,$langs,$object,$head,$h,'user'); - if (! empty($conf->hrm->enabled)) + if (! empty($conf->hrm->enabled) && $user->rights->hrm->employee->read) { // Bank $head[$h][0] = DOL_URL_ROOT.'/user/bank.php?id='.$object->id; From bcadc33e315661695ea9b8e34f20cf557a18b607 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 4 Dec 2015 15:37:28 +0100 Subject: [PATCH 119/206] Debug visibility on task/projects --- htdocs/core/boxes/box_task.php | 2 +- htdocs/core/lib/project.lib.php | 6 +-- htdocs/core/menus/init_menu_auguria.sql | 4 +- htdocs/core/menus/standard/eldy.lib.php | 4 +- htdocs/core/search.php | 2 +- htdocs/projet/activity/perday.php | 14 +++--- htdocs/projet/activity/perweek.php | 39 ++++++++------- htdocs/projet/card.php | 2 +- htdocs/projet/class/task.class.php | 27 ++++++----- htdocs/projet/contact.php | 2 +- htdocs/projet/document.php | 2 +- htdocs/projet/element.php | 2 +- htdocs/projet/ganttview.php | 2 +- htdocs/projet/list.php | 7 +-- htdocs/projet/note.php | 2 +- htdocs/projet/tasks.php | 6 +-- htdocs/projet/tasks/contact.php | 2 + htdocs/projet/tasks/document.php | 4 +- htdocs/projet/tasks/{index.php => list.php} | 53 +++++++++++++-------- htdocs/projet/tasks/note.php | 4 +- htdocs/projet/tasks/task.php | 4 +- htdocs/projet/tasks/time.php | 4 +- htdocs/theme/eldy/style.css.php | 4 ++ htdocs/theme/md/style.css.php | 4 ++ 24 files changed, 115 insertions(+), 87 deletions(-) rename htdocs/projet/tasks/{index.php => list.php} (84%) diff --git a/htdocs/core/boxes/box_task.php b/htdocs/core/boxes/box_task.php index 97767dd15d1..384e30f8b12 100644 --- a/htdocs/core/boxes/box_task.php +++ b/htdocs/core/boxes/box_task.php @@ -104,7 +104,7 @@ class box_task extends ModeleBoxes $this->info_box_contents[$i][] = array( 'td' => 'align="right"', 'text' => $objp->nb." ".$langs->trans("Tasks"), - 'url' => DOL_URL_ROOT."/projet/tasks/index.php?leftmenu=projects&viewstatut=".$objp->fk_statut, + 'url' => DOL_URL_ROOT."/projet/tasks/list.php?leftmenu=projects&viewstatut=".$objp->fk_statut, ); $totalnb += $objp->nb; $this->info_box_contents[$i][] = array('td' => 'align="right"', 'text' => ConvertSecondToTime($objp->plannedtot,'all',25200,5)); diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 97bea63e436..733a83a500f 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -794,14 +794,14 @@ function projectLinesPerWeek(&$inc, $firstdaytoshow, $fuser, $parent, $lines, &$ $dayWorkLoad = $projectstatic->weekWorkLoadPerTask[$tmpday][$lines[$i]->id]; $alreadyspent=''; if ($dayWorkLoad > 0) $alreadyspent=convertSecondToTime($dayWorkLoad,'allhourmin'); - $tableCell =''; + print ''; } print ''; @@ -328,18 +327,22 @@ $restrictviewformytask=(empty($conf->global->PROJECT_TIME_SHOW_TASK_NOT_ASSIGNED if (count($tasksarray) > 0) { + //var_dump($tasksarray); + //var_dump($tasksrole); + $j=0; + $level=0; projectLinesPerWeek($j, $firstdaytoshow, $usertoprocess, 0, $tasksarray, $level, $projectsrole, $tasksrole, $mine, $restrictviewformytask); print ' - - - - - - - + + + + + + + '; } diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index c05cb6948a5..51939d8e9fc 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -708,7 +708,7 @@ else // Define a complementary filter for search of next/prev ref. if (! $user->rights->projet->all->lire) { - $objectsListId = $object->getProjectsAuthorizedForUser($user,$mine,0); + $objectsListId = $object->getProjectsAuthorizedForUser($user,0,0); $object->next_prev_filter=" rowid in (".(count($objectsListId)?join(',',array_keys($objectsListId)):'0').")"; } print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref'); diff --git a/htdocs/projet/class/task.class.php b/htdocs/projet/class/task.class.php index c6c5f65f63d..0b490aff863 100644 --- a/htdocs/projet/class/task.class.php +++ b/htdocs/projet/class/task.class.php @@ -557,10 +557,10 @@ class Task extends CommonObject * @param string $filteronprojstatus Filter on project status * @param string $morewherefilter Add more filter into where SQL request * @param string $filteronprojuser Filter on user that is a contact of project - * @param string $filterontaskuse Filter on user assigned to task + * @param string $filterontaskuser Filter on user assigned to task * @return array Array of tasks */ - function getTasksArray($usert=0, $userp=0, $projectid=0, $socid=0, $mode=0, $filteronprojref='', $filteronprojstatus=-1, $morewherefilter='',$filteronprojuser=0,$filterontaskuse=0) + function getTasksArray($usert=0, $userp=0, $projectid=0, $socid=0, $mode=0, $filteronprojref='', $filteronprojstatus=-1, $morewherefilter='',$filteronprojuser=0,$filterontaskuser=0) { global $conf; @@ -587,11 +587,11 @@ class Task extends CommonObject } else return 'BadValueForParameterMode'; - if ($filteronprojuser) + if ($filteronprojuser > 0) { // TODO } - if ($filterontaskuser) + if ($filterontaskuser > 0) { // TODO } @@ -665,15 +665,16 @@ class Task extends CommonObject } /** - * Return list of roles for a user for each projects or each tasks (or a particular project or task). + * Return list of roles for a user for each projects or each tasks (or a particular project or a particular task). * - * @param User $userp Return roles on project for this internal user (task id can't be defined) - * @param User $usert Return roles on task for this internal user - * @param int $projectid Project id list separated with , to filter on project - * @param int $taskid Task id to filter on a task - * @return array Array (projectid => 'list of roles for project' or taskid => 'list of roles for task') + * @param User $userp Return roles on project for this internal user. If set, usert and taskid must not be defined. + * @param User $usert Return roles on task for this internal user. If set userp must not be defined. + * @param int $projectid Project id list separated with , to filter on project + * @param int $taskid Task id to filter on a task + * @param string $filteronprojstatus Filter on project status if userp is set. Not used if userp not defined. + * @return array Array (projectid => 'list of roles for project' or taskid => 'list of roles for task') */ - function getUserRolesForProjectsOrTasks($userp,$usert,$projectid='',$taskid=0) + function getUserRolesForProjectsOrTasks($userp, $usert, $projectid='', $taskid=0, $filteronprojstatus=-1) { $arrayroles = array(); @@ -694,10 +695,12 @@ class Task extends CommonObject /* Liste des taches et role sur les projets ou taches */ $sql = "SELECT pt.rowid as pid, ec.element_id, ctc.code, ctc.source"; if ($userp) $sql.= " FROM ".MAIN_DB_PREFIX."projet as pt"; - if ($usert) $sql.= " FROM ".MAIN_DB_PREFIX."projet_task as pt"; + if ($usert) $sql.= " FROM ".MAIN_DB_PREFIX."projet as p, ".MAIN_DB_PREFIX."projet_task as pt"; $sql.= ", ".MAIN_DB_PREFIX."element_contact as ec"; $sql.= ", ".MAIN_DB_PREFIX."c_type_contact as ctc"; $sql.= " WHERE pt.rowid = ec.element_id"; + if ($userp && $filteronprojstatus > -1) $sql.= " AND pt.fk_statut = ".$filteronprojstatus; + if ($usert && $filteronprojstatus > -1) $sql.= " AND pt.fk_projet = p.rowid AND p.fk_statut = ".$filteronprojstatus; if ($userp) $sql.= " AND ctc.element = 'project'"; if ($usert) $sql.= " AND ctc.element = 'project_task'"; $sql.= " AND ctc.rowid = ec.fk_c_type_contact"; diff --git a/htdocs/projet/contact.php b/htdocs/projet/contact.php index d20ad16c9fa..f2d44e74dca 100644 --- a/htdocs/projet/contact.php +++ b/htdocs/projet/contact.php @@ -161,7 +161,7 @@ if ($id > 0 || ! empty($ref)) // Define a complementary filter for search of next/prev ref. if (! $user->rights->projet->all->lire) { - $objectsListId = $object->getProjectsAuthorizedForUser($user,$mine,0); + $objectsListId = $object->getProjectsAuthorizedForUser($user,0,0); $object->next_prev_filter=" rowid in (".(count($objectsListId)?join(',',array_keys($objectsListId)):'0').")"; } print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref', ''); diff --git a/htdocs/projet/document.php b/htdocs/projet/document.php index 44332ff558c..ce033f0e193 100644 --- a/htdocs/projet/document.php +++ b/htdocs/projet/document.php @@ -115,7 +115,7 @@ if ($object->id > 0) // Define a complementary filter for search of next/prev ref. if (! $user->rights->projet->all->lire) { - $projectsListId = $object->getProjectsAuthorizedForUser($user,$mine,0); + $projectsListId = $object->getProjectsAuthorizedForUser($user,0,0); $object->next_prev_filter=" rowid in (".(count($projectsListId)?join(',',array_keys($projectsListId)):'0').")"; } print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref'); diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php index 6ef8edcc459..ff3e3c32218 100644 --- a/htdocs/projet/element.php +++ b/htdocs/projet/element.php @@ -125,7 +125,7 @@ print '"; // Project status diff --git a/htdocs/projet/class/task.class.php b/htdocs/projet/class/task.class.php index 0b490aff863..ca8ed73e10d 100644 --- a/htdocs/projet/class/task.class.php +++ b/htdocs/projet/class/task.class.php @@ -575,25 +575,60 @@ class Task extends CommonObject if ($mode == 0) { $sql.= " FROM ".MAIN_DB_PREFIX."projet as p"; + if ($filteronprojuser > 0) + { + $sql.= ", ".MAIN_DB_PREFIX."element_contact as ec"; + $sql.= ", ".MAIN_DB_PREFIX."c_type_contact as ctc"; + } $sql.= ", ".MAIN_DB_PREFIX."projet_task as t"; + if ($filterontaskuser > 0) + { + $sql.= ", ".MAIN_DB_PREFIX."element_contact as ec2"; + $sql.= ", ".MAIN_DB_PREFIX."c_type_contact as ctc2"; + } $sql.= " WHERE p.entity = ".$conf->entity; $sql.= " AND t.fk_projet = p.rowid"; } elseif ($mode == 1) { $sql.= " FROM ".MAIN_DB_PREFIX."projet as p"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."projet_task as t on t.fk_projet = p.rowid"; + if ($filteronprojuser > 0) + { + $sql.= ", ".MAIN_DB_PREFIX."element_contact as ec"; + $sql.= ", ".MAIN_DB_PREFIX."c_type_contact as ctc"; + } + if ($filterontaskuser > 0) + { + $sql.= ", ".MAIN_DB_PREFIX."projet_task as t"; + $sql.= ", ".MAIN_DB_PREFIX."element_contact as ec2"; + $sql.= ", ".MAIN_DB_PREFIX."c_type_contact as ctc2"; + } + else + { + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."projet_task as t on t.fk_projet = p.rowid"; + } $sql.= " WHERE p.entity = ".$conf->entity; } else return 'BadValueForParameterMode'; if ($filteronprojuser > 0) { - // TODO + $sql.= " AND p.rowid = ec.element_id"; + $sql.= " AND ctc.rowid = ec.fk_c_type_contact"; + $sql.= " AND ctc.element = 'project'"; + $sql.= " AND ec.fk_socpeople = ".$filteronprojuser; + $sql.= " AND ec.statut = 4"; + $sql.= " AND ctc.source = 'internal'"; } if ($filterontaskuser > 0) { - // TODO + $sql.= " AND t.fk_projet = p.rowid"; + $sql.= " AND p.rowid = ec2.element_id"; + $sql.= " AND ctc2.rowid = ec2.fk_c_type_contact"; + $sql.= " AND ctc2.element = 'project_task'"; + $sql.= " AND ec2.fk_socpeople = ".$filterontaskuser; + $sql.= " AND ec2.statut = 4"; + $sql.= " AND ctc2.source = 'internal'"; } if ($socid) $sql.= " AND p.fk_soc = ".$socid; if ($projectid) $sql.= " AND p.rowid in (".$projectid.")"; diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index 3f9aea52444..2475074d941 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -318,7 +318,6 @@ if ($resql) } // If the user can view prospects other than his' - if ($mine) $search_user=$user->id; $moreforfilter.='
'; $moreforfilter.=$langs->trans('ProjectsWithThisUserAsContact'). ': '; $includeonly=''; diff --git a/htdocs/projet/tasks/list.php b/htdocs/projet/tasks/list.php index e3540afc1aa..d23617192b3 100644 --- a/htdocs/projet/tasks/list.php +++ b/htdocs/projet/tasks/list.php @@ -128,7 +128,7 @@ if ($search_all) $morewherefilter.=natural_search(array_keys($fieldstosea if ($search_task_ref) $morewherefilter.=natural_search('t.ref', $search_task_ref); if ($search_task_label) $morewherefilter.=natural_search('t.label', $search_task_label); -$tasksarray=$taskstatic->getTasksArray(0, 0, $projectstatic->id, $socid, 0, $search_project, $search_status, $morewherefilter, $search_project_user, $search_task_user); +$tasksarray=$taskstatic->getTasksArray(0, 0, $projectstatic->id, $socid, 0, $search_project, $search_status, $morewherefilter, $search_project_user, 0); // We don't use filter on task user. Because sometimes a task is assigned but not the parent one and we want to show also parent, so filtering is done during output $tasksrole=$taskstatic->getUserRolesForProjectsOrTasks(0, ($tuser->id?$tuser:null), $projectstatic->id, 0, $search_status); // We load also tasks limited to a particular user print ''; @@ -156,7 +156,6 @@ $moreforfilter.=$form->select_dolusers($search_project_user, 'search_project_use $moreforfilter.='
'; // If the user can view users -if ($mine) $search_task_user=$user->id; $moreforfilter.='
'; $moreforfilter.=$langs->trans('TasksWithThisUserAsContact'). ': '; $includeonly=''; From 94fe00fe8dbebe190fa63e15ff1d08b1852e0c7d Mon Sep 17 00:00:00 2001 From: philippe grand Date: Fri, 4 Dec 2015 19:45:39 +0100 Subject: [PATCH 125/206] [Qual] Uniformize code --- htdocs/compta/facture/list.php | 2 +- htdocs/ecm/docmine.php | 4 ++-- htdocs/expedition/card.php | 14 +++++++------- htdocs/expensereport/card.php | 24 ++++++++++++------------ 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index cce908dc368..707ad32eec7 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -138,7 +138,7 @@ if (empty($reshook)) if (! empty($massaction) && count($toselect) < 1) { $error++; - setEventMessage("NoLineChecked","warnings"); + setEventMessages($langs->trans("NoLineChecked"), null, "warnings"); } if (! $error && $massaction == 'confirm_presend') diff --git a/htdocs/ecm/docmine.php b/htdocs/ecm/docmine.php index 2ec6dfc4aae..13f5ee516b9 100644 --- a/htdocs/ecm/docmine.php +++ b/htdocs/ecm/docmine.php @@ -114,8 +114,8 @@ if ($action == 'confirm_deletefile' && $confirm == 'yes') $langs->load("other"); $file = $upload_dir . "/" . GETPOST('urlfile'); // Do not use urldecode here ($_GET and $_REQUEST are already decoded by PHP). $ret=dol_delete_file($file); - if ($ret) setEventMessage($langs->trans("FileWasRemoved", GETPOST('urlfile'))); - else setEventMessage($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), 'errors'); + if ($ret) setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile')), null, 'mesgs'); + else setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), null, 'errors'); $result=$ecmdir->changeNbOfFiles('-'); } diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php index 6a236ab534e..36d85366805 100644 --- a/htdocs/expedition/card.php +++ b/htdocs/expedition/card.php @@ -98,7 +98,7 @@ if (($action == 'create') || ($action == 'add')) if (! (GETPOST('entrepot_id','int') > 0)) { $langs->load("errors"); - setEventMessage($langs->trans("WarehouseMustBeSelectedAtFirstStepWhenProductBatchModuleOn"),'errors'); + setEventMessages($langs->trans("WarehouseMustBeSelectedAtFirstStepWhenProductBatchModuleOn"), null, 'errors'); header("Location: ".DOL_URL_ROOT.'/expedition/shipment.php?id='.$origin_id); exit; } @@ -303,7 +303,7 @@ if (empty($reshook)) if ($result < 0) { $langs->load("errors"); - setEventMessage($langs->trans($object->error),'errors'); + setEventMessages($langs->trans($object->error), null, 'errors'); } else { @@ -338,7 +338,7 @@ if (empty($reshook)) else { $langs->load("errors"); - setEventMessage($langs->trans($object->error),'errors'); + setEventMessages($langs->trans($object->error), null, 'errors'); } } @@ -395,7 +395,7 @@ if (empty($reshook)) header("Location: card.php?id=".$object->id); exit; } - setEventMessage($object->error,'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } $action=""; @@ -433,8 +433,8 @@ if (empty($reshook)) $upload_dir = $conf->expedition->dir_output . "/sending"; $file = $upload_dir . '/' . GETPOST('file'); $ret=dol_delete_file($file,0,0,0,$object); - if ($ret) setEventMessage($langs->trans("FileWasRemoved", GETPOST('urlfile'))); - else setEventMessage($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), 'errors'); + if ($ret) setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile')), null, 'mesgs'); + else setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), null, 'errors'); } elseif ($action == 'classifybilled') @@ -482,7 +482,7 @@ if ($action == 'create') print load_fiche_titre($langs->trans("CreateASending")); if (! $origin) { - setEventMessage($langs->trans("ErrorBadParameters"),'errors'); + setEventMessages($langs->trans("ErrorBadParameters"), null, 'errors'); } dol_htmloutput_mesg($mesg); diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index f5d38bc001c..e7b0be3d6d5 100644 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -139,7 +139,7 @@ if ($action == 'add' && $user->rights->expensereport->creer) if ($object->periode_existe($user,$object->date_debut,$object->date_fin)) { $error++; - setEventMessage($langs->trans("ErrorDoubleDeclaration"),'errors'); + setEventMessages($langs->trans("ErrorDoubleDeclaration"), null, 'errors'); $action='create'; } @@ -267,7 +267,7 @@ if ($action == "confirm_validate" && GETPOST("confirm") == "yes" && $id > 0 && $ if ($result) { $mesg=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($emailFrom,2),$mailfile->getValidAddress($emailTo,2)); - setEventMessage($mesg); + setEventMessages($mesg, null, 'mesgs'); header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id); exit; } @@ -279,11 +279,11 @@ if ($action == "confirm_validate" && GETPOST("confirm") == "yes" && $id > 0 && $ $mesg=''; $mesg.=$langs->trans('ErrorFailedToSendMail', $emailFrom, $emailTo); $mesg.='
'.$mailfile->error; - setEventMessage($mesg,'errors'); + setEventMessages($mesg, null, 'errors'); } else { - setEventMessage('No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', 'warnings'); + setEventMessages('No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS', null, 'warnings'); } } } @@ -295,7 +295,7 @@ if ($action == "confirm_validate" && GETPOST("confirm") == "yes" && $id > 0 && $ } else { - setEventMessage($langs->trans("NoEmailSentBadSenderOrRecipientEmail"), 'warnings'); + setEventMessages($langs->trans("NoEmailSentBadSenderOrRecipientEmail"), null, 'warnings'); $action=''; } } @@ -490,15 +490,15 @@ if ($action == "confirm_approve" && GETPOST("confirm") == "yes" && $id > 0 && $u // SEND $result=$mailfile->sendfile(); if ($result): - setEventMessage($langs->trans("MailSuccessfulySent",$emailFrom,$emailTo)); + setEventMessages($langs->trans("MailSuccessfulySent",$emailFrom,$emailTo), null, 'mesgs'); Header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id); exit; else: - setEventMessage($langs->trans("ErrorFailedToSendMail",$emailFrom,$emailTo),'errors'); + setEventMessages($langs->trans("ErrorFailedToSendMail",$emailFrom,$emailTo), null, 'errors'); endif; else: - setEventMessage($langs->trans("ErrorFailedToSendMail",$emailFrom,$emailTo),'errors'); + setEventMessages($langs->trans("ErrorFailedToSendMail",$emailFrom,$emailTo), null, 'errors'); endif; // END - Send mail else : // if ($resultPDF) @@ -576,13 +576,13 @@ if ($action == "confirm_refuse" && GETPOST('confirm')=="yes" && $id > 0 && $user $result=$mailfile->sendfile(); if ($result) { - setEventMessage($langs->trans("MailSuccessfulySent",$emailFrom,$emailTo)); + setEventMessages($langs->trans("MailSuccessfulySent",$emailFrom,$emailTo), null, 'mesgs'); Header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id); exit; } else { - setEventMessage($langs->trans("ErrorFailedToSendMail",$emailFrom,$emailTo),'errors'); + setEventMessages($langs->trans("ErrorFailedToSendMail",$emailFrom,$emailTo), null, 'errors'); $mesg="Impossible d'envoyer l'email."; } // END - Send mail @@ -1059,8 +1059,8 @@ else if ($action == 'remove_file') $upload_dir = $conf->expensereport->dir_output; $file = $upload_dir . '/' . GETPOST('file'); $ret=dol_delete_file($file,0,0,0,$object); - if ($ret) setEventMessage($langs->trans("FileWasRemoved", GETPOST('urlfile'))); - else setEventMessage($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), 'errors'); + if ($ret) setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile')), null, 'mesgs'); + else setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), null, 'errors'); $action=''; } } From 5cd43d2df0ae9c742f7222c973c12b6ffb5fa23e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 4 Dec 2015 20:51:34 +0100 Subject: [PATCH 126/206] Some debug on new features --- .../comm/action/class/cactioncomm.class.php | 15 +++++++------ htdocs/comm/action/index.php | 8 +++---- htdocs/comm/action/listactions.php | 20 ++++++++++++------ htdocs/comm/action/peruser.php | 2 +- htdocs/core/class/html.formactions.class.php | 15 ++++++------- htdocs/core/lib/agenda.lib.php | 13 ++++++++---- htdocs/theme/eldy/style.css.php | 4 +++- htdocs/theme/md/img/menus/cart.png | Bin 0 -> 259 bytes htdocs/theme/md/img/menus/graph.png | Bin 0 -> 179 bytes htdocs/theme/md/img/menus/members.png | Bin 145 -> 210 bytes htdocs/theme/md/img/menus/money.png | Bin 179 -> 256 bytes htdocs/theme/md/img/menus/shop.png | Bin 259 -> 403 bytes htdocs/theme/md/img/object_bookmark.png | Bin 131 -> 201 bytes htdocs/theme/md/img/warning.png | Bin 169 -> 392 bytes htdocs/theme/md/style.css.php | 2 ++ 15 files changed, 48 insertions(+), 31 deletions(-) create mode 100644 htdocs/theme/md/img/menus/cart.png create mode 100644 htdocs/theme/md/img/menus/graph.png diff --git a/htdocs/comm/action/class/cactioncomm.class.php b/htdocs/comm/action/class/cactioncomm.class.php index 56465d45fdb..5e14b45665b 100644 --- a/htdocs/comm/action/class/cactioncomm.class.php +++ b/htdocs/comm/action/class/cactioncomm.class.php @@ -99,13 +99,14 @@ class CActionComm /** * Return list of event types: array(id=>label) or array(code=>label) * - * @param string|int $active 1 or 0 to filter on event state active or not ('' by default = no filter) + * @param string|int $active 1 or 0 to filter on event state active or not ('' by default = no filter) * @param string $idorcode 'id' or 'code' - * @param string $excludetype Type to exclude - * @param int $onlyautoornot Group list by auto events or not + * @param string $excludetype Type to exclude ('system' or 'systemauto') + * @param int $onlyautoornot 1=Group all type AC_XXX into 1 line AC_MANUAL. 0=Keep details of type + * @param string $morefilter Add more SQL filter * @return mixed Array of all event types if OK, <0 if KO */ - function liste_array($active='',$idorcode='id',$excludetype='',$onlyautoornot=0) + function liste_array($active='',$idorcode='id',$excludetype='',$onlyautoornot=0, $morefilter='') { global $langs,$conf; $langs->load("commercial"); @@ -115,8 +116,10 @@ class CActionComm $sql = "SELECT id, code, libelle, module, type, color"; $sql.= " FROM ".MAIN_DB_PREFIX."c_actioncomm"; - if ($active != '') $sql.=" WHERE active=".$active; - if (! empty($excludetype)) $sql.=($active != ''?" AND":" WHERE")." type <> '".$excludetype."'"; + $sql.= " WHERE 1=1"; + if ($active != '') $sql.=" AND active=".$active; + if (! empty($excludetype)) $sql.=" AND type <> '".$excludetype."'"; + if ($morefilter) $sql.=" AND ".$morefilter; $sql.= " ORDER BY module, position"; dol_syslog(get_class($this)."::liste_array", LOG_DEBUG); diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index 9b466e3d9b7..2324b6ee799 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -902,7 +902,7 @@ if (count($listofextcals)) $daykey=dol_mktime(0,0,0,$mois,$jour,$annee); $daykeygmt=dol_mktime(0,0,0,$mois,$jour,$annee,true,0); do - { + { //if ($event->fulldayevent) print dol_print_date($daykeygmt,'dayhour','gmt').'-'.dol_print_date($daykey,'dayhour','gmt').'-'.dol_print_date($event->date_end_in_calendar,'dayhour','gmt').' '; $eventarray[$daykey][]=$event; $daykey+=60*60*24; $daykeygmt+=60*60*24; // Add one day @@ -951,7 +951,7 @@ if (empty($action) || $action == 'show_month') // View by month $newparam=preg_replace('/viewcal=[0-9]+&?/i','',$newparam); $newparam=preg_replace('/showbirthday_=/i','showbirthday=',$newparam); // Restore correct parameter $newparam.='&viewcal=1'; - echo '
'.$langs->trans("LastContracts",($num<=$MAXLIST?"":$MAXLIST)).''; print '
'.$langs->trans("LastContracts",($num<=$MAXLIST?"":$MAXLIST)).''.$langs->trans("AllContracts").' '.$num.'
'.dol_trunc($objp->refsup,12)."'.dol_print_date($db->jdate($objp->dc),'day')."'.dol_print_date($db->jdate($objp->dcon),'day')." '; - if ($objp->email) print ''; + $selected=0; + if (in_array($objp->facid, $arrayofinvoices)) $selected=1; + if ($objp->email) print ''; else print img_picto($langs->trans("NoEMail"), 'warning.png'); print '
'; // editeur wysiwyg - if ($conf->global->FICHINTER_EMPTY_LINE_DESC != 1) { + if (empty($conf->global->FICHINTER_EMPTY_LINE_DESC)) { require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php'; $doleditor = new DolEditor('np_desc', GETPOST('np_desc', 'alpha'), '', 100, 'dolibarr_details', '', false, true, $conf->global->FCKEDITOR_ENABLE_DETAILS, ROWS_2, 70); $doleditor->Create(); From ebc1105b5c14e2de73b82eca6c713c7aa7a6b9b7 Mon Sep 17 00:00:00 2001 From: AlainRnet Date: Thu, 3 Dec 2015 21:09:09 +0100 Subject: [PATCH 113/206] Update fraise.modules.php following discussion with eldy (https://github.com/Dolibarr/dolibarr/pull/4079#issuecomment-161601400) to mix a french forum membre to select mailing member by type, I try to update this selector to integrate selection by type. Thanks in advance for feedback --- .../core/modules/mailings/fraise.modules.php | 125 +++++++++++------- 1 file changed, 78 insertions(+), 47 deletions(-) diff --git a/htdocs/core/modules/mailings/fraise.modules.php b/htdocs/core/modules/mailings/fraise.modules.php index 2716bdc1e4c..ca9f2b11f0d 100644 --- a/htdocs/core/modules/mailings/fraise.modules.php +++ b/htdocs/core/modules/mailings/fraise.modules.php @@ -28,16 +28,16 @@ include_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php'; /** - * Class to generate target according to rule Fraise + * Class to generate target according to rule Fraise */ class mailing_fraise extends MailingTargets { - // CHANGE THIS: Put here a name not already used - var $name='FundationMembers'; // Identifiant du module mailing - // CHANGE THIS: Put here a description of your selector module. - // This label is used if no translation found for key MailingModuleDescXXX where XXX=name is found + // CHANGE THIS: Put here a name not already used + var $name='FundationMembers'; // Identifiant du module mailing + // CHANGE THIS: Put here a description of your selector module. + // This label is used if no translation found for key MailingModuleDescXXX where XXX=name is found var $desc='Foundation members with emails (by status)'; - // CHANGE THIS: Set to 1 if selector is available for admin users only + // CHANGE THIS: Set to 1 if selector is available for admin users only var $require_admin=0; var $require_module=array('adherent'); @@ -46,11 +46,11 @@ class mailing_fraise extends MailingTargets var $db; - /** - * Constructor - * - * @param DoliDB $db Database handler - */ + /** + * Constructor + * + * @param DoliDB $db Database handler + */ function __construct($db) { $this->db=$db; @@ -58,37 +58,37 @@ class mailing_fraise extends MailingTargets /** - * On the main mailing area, there is a box with statistics. - * If you want to add a line in this report you must provide an - * array of SQL request that returns two field: - * One called "label", One called "nb". - * - * @return string[] Array with SQL requests - */ + * On the main mailing area, there is a box with statistics. + * If you want to add a line in this report you must provide an + * array of SQL request that returns two field: + * One called "label", One called "nb". + * + * @return array Array with SQL requests + */ function getSqlArrayForStats() - { + { global $langs; $langs->load("members"); - // Array for requests for statistics board - $statssql=array(); + // Array for requests for statistics board + $statssql=array(); $statssql[0] ="SELECT '".$this->db->escape($langs->trans("FundationMembers"))."' as label, count(*) as nb"; - $statssql[0].=" FROM ".MAIN_DB_PREFIX."adherent where statut = 1"; + $statssql[0].=" FROM ".MAIN_DB_PREFIX."adherent where statut = 1"; - return $statssql; - } + return $statssql; + } /** - * Return here number of distinct emails returned by your selector. - * For example if this selector is used to extract 500 different - * emails from a text file, this function must return 500. - * - * @param string $sql Requete sql de comptage - * @return int Nb of recipients - */ + * Return here number of distinct emails returned by your selector. + * For example if this selector is used to extract 500 different + * emails from a text file, this function must return 500. + * + * @param string $sql Requete sql de comptage + * @return int Nb of recipients + */ function getNbOfRecipients($sql='') { $sql = "SELECT count(distinct(a.email)) as nb"; @@ -108,7 +108,7 @@ class mailing_fraise extends MailingTargets */ function formFilter() { - global $langs; + global $conf, $langs; $langs->load("members"); $form=new Form($this->db); @@ -121,6 +121,36 @@ class mailing_fraise extends MailingTargets $s.=''; $s.=''; $s.=''; + $s.=' '; + $s.=$langs->trans("Type").': '; + $s.=''; $s.='
'; $s.=$langs->trans("DateEndSubscription").':  '; @@ -135,7 +165,7 @@ class mailing_fraise extends MailingTargets /** * Renvoie url lien vers fiche de la source du destinataire du mailing * - * @param int $id ID + * @param int $id ID * @return string Url lien */ function url($id) @@ -147,9 +177,9 @@ class mailing_fraise extends MailingTargets /** * Ajoute destinataires dans table des cibles * - * @param int $mailing_id Id of emailing - * @param array $filtersarray Param to filter sql request. Deprecated. Should use $_POST instead. - * @return int < 0 si erreur, nb ajout si ok + * @param int $mailing_id Id of emailing + * @param array $filtersarray Param to filter sql request. Deprecated. Should use $_POST instead. + * @return int < 0 si erreur, nb ajout si ok */ function add_to_target($mailing_id,$filtersarray=array()) { @@ -162,7 +192,7 @@ class mailing_fraise extends MailingTargets $langs->load("members"); $langs->load("companies"); - $cibles = array(); + $cibles = array(); $now=dol_now(); $dateendsubscriptionafter=dol_mktime($_POST['subscriptionafterhour'],$_POST['subscriptionaftermin'],$_POST['subscriptionaftersec'],$_POST['subscriptionaftermonth'],$_POST['subscriptionafterday'],$_POST['subscriptionafteryear']); @@ -171,8 +201,8 @@ class mailing_fraise extends MailingTargets // La requete doit retourner: id, email, fk_contact, name, firstname $sql = "SELECT a.rowid as id, a.email as email, null as fk_contact, "; $sql.= " a.lastname, a.firstname,"; - $sql.= " a.datefin, a.civility as civility_id, a.login, a.societe"; // Other fields - $sql.= " FROM ".MAIN_DB_PREFIX."adherent as a"; + $sql.= " a.datefin, a.civility as civility_id, a.login, a.societe"; // Other fields + $sql.= " FROM ".MAIN_DB_PREFIX."adherent as a, ".MAIN_DB_PREFIX."adherent_type as ta"; $sql.= " WHERE a.email <> ''"; // Note that null != '' is false $sql.= " AND a.email NOT IN (SELECT email FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE fk_mailing=".$mailing_id.")"; if (isset($_POST["filter"]) && $_POST["filter"] == '-1') $sql.= " AND a.statut=-1"; @@ -181,6 +211,8 @@ class mailing_fraise extends MailingTargets if (isset($_POST["filter"]) && $_POST["filter"] == '0') $sql.= " AND a.statut=0"; if ($dateendsubscriptionafter > 0) $sql.=" AND datefin > '".$this->db->idate($dateendsubscriptionafter)."'"; if ($dateendsubscriptionbefore > 0) $sql.=" AND datefin < '".$this->db->idate($dateendsubscriptionbefore)."'"; + $sql.= " AND a.fk_adherent_type = ta.rowid"; + if ($_POST['filter']) $sql.= " AND ta.rowid='".$_POST['filter']."'"; $sql.= " ORDER BY a.email"; //print $sql; @@ -202,11 +234,11 @@ class mailing_fraise extends MailingTargets if ($old <> $obj->email) { $cibles[$j] = array( - 'email' => $obj->email, - 'fk_contact' => $obj->fk_contact, - 'lastname' => $obj->lastname, - 'firstname' => $obj->firstname, - 'other' => + 'email' => $obj->email, + 'fk_contact' => $obj->fk_contact, + 'lastname' => $obj->lastname, + 'firstname' => $obj->firstname, + 'other' => ($langs->transnoentities("Login").'='.$obj->login).';'. ($langs->transnoentities("UserTitle").'='.($obj->civility_id?$langs->transnoentities("Civility".$obj->civility_id):'')).';'. ($langs->transnoentities("DateEnd").'='.dol_print_date($this->db->jdate($obj->datefin),'day')).';'. @@ -214,7 +246,7 @@ class mailing_fraise extends MailingTargets 'source_url' => $this->url($obj->id), 'source_id' => $obj->id, 'source_type' => 'member' - ); + ); $old = $obj->email; $j++; } @@ -230,7 +262,6 @@ class mailing_fraise extends MailingTargets } return parent::add_to_target($mailing_id, $cibles); - } + } } - From b45d4a2a513459af9552c491400d87b97c7c444f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 3 Dec 2015 22:29:44 +0100 Subject: [PATCH 114/206] [Qual] OOP detection of PHP MySQL driver --- htdocs/core/db/mysqli.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/db/mysqli.class.php b/htdocs/core/db/mysqli.class.php index 068cd410326..8b68fa921ac 100644 --- a/htdocs/core/db/mysqli.class.php +++ b/htdocs/core/db/mysqli.class.php @@ -69,7 +69,7 @@ class DoliDBMysqli extends DoliDB //print "Name DB: $host,$user,$pass,$name
"; - if (! function_exists("mysqli_connect")) + if (! class_exists('mysqli')) { $this->connected = false; $this->ok = false; From d2b221cfd1ebb60a0d53b8b74b27b9cc9a730550 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 4 Dec 2015 10:22:27 +0100 Subject: [PATCH 115/206] Upgrade PHPCS rules --- dev/codesniffer/ruleset.xml | 156 ++++++++++++++++-------------------- 1 file changed, 70 insertions(+), 86 deletions(-) diff --git a/dev/codesniffer/ruleset.xml b/dev/codesniffer/ruleset.xml index 9f20324da3f..321560ff6f9 100755 --- a/dev/codesniffer/ruleset.xml +++ b/dev/codesniffer/ruleset.xml @@ -12,10 +12,16 @@ + + + 0 + + + @@ -41,9 +47,6 @@ 0 - - - @@ -161,8 +164,6 @@ 0 - - @@ -170,102 +171,46 @@ - + + + + + - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - + 0 - - 0 - - - 0 - - - 0 - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - + + 0 + 0 + 0 + 0 + 0 - - - 0 - - - 0 - - - - 0 - - - 0 - - - 0 - - - 0 - + + - - 0 - + + 5 - + + 0 + + + 0 + + + + + + 0 + + + + 0 + + + + + + 0 + + + + 0 + + 0 @@ -319,6 +289,15 @@ + + 0 + + + 0 + + + 0 + 0 @@ -334,12 +313,6 @@ 0 - - 0 - - - 0 - @@ -371,15 +344,20 @@ 0 + 0 0 - + + + 0 + + + + + + + + From 4dd1cb3e77fdc27e30d20847f596f46d944d91ee Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 4 Dec 2015 12:12:12 +0100 Subject: [PATCH 116/206] Theme MD looks ready for 3.9 now. --- htdocs/core/lib/project.lib.php | 18 ++++++++------ htdocs/main.inc.php | 4 +-- htdocs/projet/index.php | 2 +- htdocs/theme/eldy/style.css.php | 13 +++++----- htdocs/theme/md/graph-color.php | 2 +- htdocs/theme/md/style.css.php | 44 +++++++++++++++++++++++---------- 6 files changed, 51 insertions(+), 32 deletions(-) diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 0569e90d903..5eeb13ca937 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -874,11 +874,11 @@ function searchTaskInChild(&$inc, $parent, &$lines, &$taskrole) * @param DoliDB $db Database handler * @param Form $form Object form * @param int $socid Id thirdparty - * @param int $projectsListId Id of project i have permission on - * @param int $mytasks Limited to task i am contact to + * @param int $projectsListId Id of project I have permission on + * @param int $mytasks Limited to task I am contact to * @param int $statut -1=No filter on statut, 0 or 1 = Filter on status * @param array $listofoppstatus List of opportunity status - * @param array $hiddenfields List of fields to not show + * @param array $hiddenfields List of info to not show ('projectlabel', 'declaredprogress', '...', ) * @return void */ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks=0, $statut=-1, $listofoppstatus=array(),$hiddenfields=array()) @@ -993,7 +993,7 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks= if (empty($conf->global->PROJECT_HIDE_TASKS)) { print_liste_field_titre($langs->trans("Tasks"),"","","","",'align="right"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("PlannedWorkload"),"","","","",'align="right"',$sortfield,$sortorder); + if (! in_array('plannedworkload', $hiddenfields)) print_liste_field_titre($langs->trans("PlannedWorkload"),"","","","",'align="right"',$sortfield,$sortorder); if (! in_array('declaredprogress', $hiddenfields)) print_liste_field_titre($langs->trans("ProgressDeclared"),"","","","",'align="right"',$sortfield,$sortorder); } print_liste_field_titre($langs->trans("Status"),"","","","",'align="right"',$sortfield,$sortorder); @@ -1016,7 +1016,7 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks= print '
'; $projectstatic->ref=$objp->ref; print $projectstatic->getNomUrl(1); - print ' - '.dol_trunc($objp->title,24); + if (! in_array('projectlabel', $hiddenfields)) print ' - '.dol_trunc($objp->title,24); print ''; if ($objp->fk_soc > 0) @@ -1044,8 +1044,10 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks= $plannedworkload=$objp->planned_workload; $total_plannedworkload+=$plannedworkload; - print ''.($plannedworkload?convertSecondToTime($plannedworkload):'').''.($plannedworkload?convertSecondToTime($plannedworkload):'').''.$total_task.''.($total_plannedworkload?convertSecondToTime($total_plannedworkload):'').''.($total_plannedworkload?convertSecondToTime($total_plannedworkload):'').''.($total_plannedworkload?round(100*$total_declaredprogressworkload/$total_plannedworkload,0).'%':'').''.price($total_opp_amount, 0, '', 1, -1, -1, $conf->currency).''.$form->textwithpicto(price($ponderated_opp_amount, 0, '', 1, -1, -1, $conf->currency), $langs->trans("OpportunityPonderatedAmount"), 1).''.$form->textwithpicto(price($ponderated_opp_amount, 0, '', 1, -1, -1, $conf->currency), $langs->trans("OpportunityPonderatedAmountDesc"), 1).''; - $tableCell.=''; + $tableCell =''; + $tableCell.=''; //$placeholder=' placeholder="00:00"'; $placeholder=''; //if (! $disabledtask) //{ $tableCell.='+'; - $tableCell.='trans("AddHereTimeSpentForDay",$tmparray['day'],$tmparray['mon']).'" title="'.$langs->trans("AddHereTimeSpentForDay",$tmparray['day'],$tmparray['mon']).'" '.($disabledtask?'disabled':$placeholder).' class="center smallpadd" size="2" id="timeadded['.$inc.']['.$idw.']" name="task['.$lines[$i]->id.']['.$idw.']" value="" cols="2" maxlength="5"'; $tableCell.=' onkeypress="return regexEvent(this,event,\'timeChar\')"'; $tableCell.= 'onblur="regexEvent(this,event,\''.$modeinput.'\'); updateTotal('.$idw.',\''.$modeinput.'\')" />'; //} diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql index 6e21ae19c0f..9f583ed4c04 100644 --- a/htdocs/core/menus/init_menu_auguria.sql +++ b/htdocs/core/menus/init_menu_auguria.sql @@ -259,12 +259,12 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3700__+MAX_llx_menu__, 'project', '', 7__+MAX_llx_menu__, '/projet/activity/index.php?leftmenu=projects', 'Activities', 0, 'projects', '$user->rights->projet->lire', '', 2, 0, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3701__+MAX_llx_menu__, 'project', '', 3700__+MAX_llx_menu__, '/projet/tasks.php?leftmenu=projects&action=create', 'NewTask', 1, 'projects', '$user->rights->projet->creer', '', 2, 1, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3702__+MAX_llx_menu__, 'project', '', 3700__+MAX_llx_menu__, '/projet/tasks/index.php?leftmenu=projects', 'List', 1, 'projects', '$user->rights->projet->lire', '', 2, 2, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3702__+MAX_llx_menu__, 'project', '', 3700__+MAX_llx_menu__, '/projet/tasks/list.php?leftmenu=projects', 'List', 1, 'projects', '$user->rights->projet->lire', '', 2, 2, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3703__+MAX_llx_menu__, 'project', '', 3700__+MAX_llx_menu__, '/projet/activity/perweek.php?leftmenu=projects', 'NewTimeSpent', 1, 'projects', '$user->rights->projet->lire', '', 2, 3, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3800__+MAX_llx_menu__, 'project', '', 7__+MAX_llx_menu__, '/projet/activity/index.php?leftmenu=projects&mode=mine', 'MyActivities', 0, 'projects', '$user->rights->projet->lire', '', 2, 0, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3801__+MAX_llx_menu__, 'project', '', 3800__+MAX_llx_menu__, '/projet/tasks.php?leftmenu=projects&action=create&mode=mine', 'NewTask', 1, 'projects', '$user->rights->projet->creer', '', 2, 1, __ENTITY__); -insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3802__+MAX_llx_menu__, 'project', '', 3800__+MAX_llx_menu__, '/projet/tasks/index.php?leftmenu=projects&mode=mine', 'List', 1, 'projects', '$user->rights->projet->lire', '', 2, 2, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3802__+MAX_llx_menu__, 'project', '', 3800__+MAX_llx_menu__, '/projet/tasks/list.php?leftmenu=projects&mode=mine', 'List', 1, 'projects', '$user->rights->projet->lire', '', 2, 2, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->projet->enabled', __HANDLER__, 'left', 3803__+MAX_llx_menu__, 'project', '', 3800__+MAX_llx_menu__, '/projet/activity/perweek.php?leftmenu=projects&mode=mine', 'NewTimeSpent', 1, 'projects', '$user->rights->projet->lire', '', 2, 3, __ENTITY__); -- Tools insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->mailing->enabled', __HANDLER__, 'left', 3900__+MAX_llx_menu__, 'tools', 'mailing', 8__+MAX_llx_menu__, '/comm/mailing/index.php?leftmenu=mailing', 'EMailings', 0, 'mails', '$user->rights->mailing->lire', '', 0, 0, __ENTITY__); diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 03b3dc785bb..a04448b60d6 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1213,13 +1213,13 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu // Project affected to user $newmenu->add("/projet/activity/index.php?mode=mine", $langs->trans("MyActivities"), 0, $user->rights->projet->lire); $newmenu->add("/projet/tasks.php?action=create&mode=mine", $langs->trans("NewTask"), 1, $user->rights->projet->creer); - $newmenu->add("/projet/tasks/index.php?mode=mine", $langs->trans("List"), 1, $user->rights->projet->lire); + $newmenu->add("/projet/tasks/list.php?mode=mine", $langs->trans("List"), 1, $user->rights->projet->lire); $newmenu->add("/projet/activity/perweek.php?mode=mine", $langs->trans("NewTimeSpent"), 1, $user->rights->projet->creer); // All project i have permission on $newmenu->add("/projet/activity/index.php", $langs->trans("Activities"), 0, $user->rights->projet->lire && $user->rights->projet->lire); $newmenu->add("/projet/tasks.php?action=create", $langs->trans("NewTask"), 1, $user->rights->projet->creer && $user->rights->projet->creer); - $newmenu->add("/projet/tasks/index.php", $langs->trans("List"), 1, $user->rights->projet->lire && $user->rights->projet->lire); + $newmenu->add("/projet/tasks/list.php", $langs->trans("List"), 1, $user->rights->projet->lire && $user->rights->projet->lire); $newmenu->add("/projet/activity/perweek.php", $langs->trans("NewTimeSpent"), 1, $user->rights->projet->creer && $user->rights->projet->creer); } } diff --git a/htdocs/core/search.php b/htdocs/core/search.php index 5f66c34721d..ccb8838e42f 100644 --- a/htdocs/core/search.php +++ b/htdocs/core/search.php @@ -126,7 +126,7 @@ if (GETPOST('search_project') != '') } if (GETPOST('search_task') != '') { - header("Location: ".DOL_URL_ROOT.'/projet/tasks/index.php?mode=search&search_all='.urlencode(GETPOST('search_task'))); + header("Location: ".DOL_URL_ROOT.'/projet/tasks/list.php?mode=search&search_all='.urlencode(GETPOST('search_task'))); exit; } diff --git a/htdocs/projet/activity/perday.php b/htdocs/projet/activity/perday.php index 93305dbc63c..5af9e9d57c3 100644 --- a/htdocs/projet/activity/perday.php +++ b/htdocs/projet/activity/perday.php @@ -245,10 +245,10 @@ if ($id) $project->fetch_thirdparty(); } -$onlyopened=1; // or -1 -$tasksarray=$taskstatic->getTasksArray(0,0,($project->id?$project->id:$projectsListId),$socid,0,'',$onlyopened); // We want to see all task of opened project i am allowed to see, not only mine. Later only mine will be editable later. -$projectsrole=$taskstatic->getUserRolesForProjectsOrTasks($usertoprocess,0,($project->id?$project->id:$projectsListId),0); -$tasksrole=$taskstatic->getUserRolesForProjectsOrTasks(0,$usertoprocess,($project->id?$project->id:$projectsListId),0); +$onlyopenedproject=1; // or -1 +$tasksarray=$taskstatic->getTasksArray(0, 0, ($project->id?$project->id:0), $socid, 0, '', $onlyopenedproject); // We want to see all task of opened project i am allowed to see, not only mine. Later only mine will be editable later. +$projectsrole=$taskstatic->getUserRolesForProjectsOrTasks($usertoprocess, 0, ($project->id?$project->id:0), 0, $onlyopenedproject); +$tasksrole=$taskstatic->getUserRolesForProjectsOrTasks(0, $usertoprocess, ($project->id?$project->id:0), 0, $onlyopenedproject); //var_dump($tasksarray); //var_dump($projectsrole); //var_dump($taskrole); @@ -284,11 +284,11 @@ $head=project_timesheet_prepare_head($mode); dol_fiche_head($head, 'inputperday', '', 0, 'task'); // Show description of content -if ($mine) print $langs->trans("MyTasksDesc").($onlyopened?' '.$langs->trans("OnlyOpenedProject"):'').'
'; +if ($mine) print $langs->trans("MyTasksDesc").($onlyopenedproject?' '.$langs->trans("OnlyOpenedProject"):'').'
'; else { - if ($user->rights->projet->all->lire && ! $socid) print $langs->trans("ProjectsDesc").($onlyopened?' '.$langs->trans("OnlyOpenedProject"):'').'
'; - else print $langs->trans("ProjectsPublicTaskDesc").($onlyopened?' '.$langs->trans("AlsoOnlyOpenedProject"):'').'
'; + if ($user->rights->projet->all->lire && ! $socid) print $langs->trans("ProjectsDesc").($onlyopenedproject?' '.$langs->trans("OnlyOpenedProject"):'').'
'; + else print $langs->trans("ProjectsPublicTaskDesc").($onlyopenedproject?' '.$langs->trans("AlsoOnlyOpenedProject"):'').'
'; } if ($mine) { diff --git a/htdocs/projet/activity/perweek.php b/htdocs/projet/activity/perweek.php index a8f531cc790..8a65dfe4162 100644 --- a/htdocs/projet/activity/perweek.php +++ b/htdocs/projet/activity/perweek.php @@ -215,19 +215,18 @@ $taskstatic = new Task($db); $title=$langs->trans("TimeSpent"); if ($mine) $title=$langs->trans("MyTimeSpent"); -//$projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,1); -$projectsListId = $projectstatic->getProjectsAuthorizedForUser($usertoprocess,0,1); // Return all project i have permission on. I want my tasks and some of my task may be on a public projet that is not my project - +$projectsListId = $projectstatic->getProjectsAuthorizedForUser($usertoprocess,0,1); // Return all project i have permission on (assigned to me+public). I want my tasks and some of my task may be on a public projet that is not my project +//var_dump($projectsListId); if ($id) { $project->fetch($id); $project->fetch_thirdparty(); } -$onlyopened=1; // or -1 -$tasksarray=$taskstatic->getTasksArray(0,0,($project->id?$project->id:$projectsListId),$socid,0,'',$onlyopened); // We want to see all task of opened project i am allowed to see, not only mine. Later only mine will be editable later. -$projectsrole=$taskstatic->getUserRolesForProjectsOrTasks($usertoprocess,0,($project->id?$project->id:$projectsListId),0); -$tasksrole=$taskstatic->getUserRolesForProjectsOrTasks(0,$usertoprocess,($project->id?$project->id:$projectsListId),0); +$onlyopenedproject=1; // or -1 +$tasksarray=$taskstatic->getTasksArray(0, 0, ($project->id?$project->id:0), $socid, 0, '', $onlyopenedproject); // We want to see all task of opened project i am allowed to see, not only mine. Later only mine will be editable later. +$projectsrole=$taskstatic->getUserRolesForProjectsOrTasks($usertoprocess, 0, ($project->id?$project->id:0), 0, $onlyopenedproject); +$tasksrole=$taskstatic->getUserRolesForProjectsOrTasks(0, $usertoprocess, ($project->id?$project->id:0), 0, $onlyopenedproject); //var_dump($tasksarray); //var_dump($projectsrole); //var_dump($taskrole); @@ -261,11 +260,11 @@ $head=project_timesheet_prepare_head($mode); dol_fiche_head($head, 'inputperweek', '', 0, 'task'); // Show description of content -if ($mine) print $langs->trans("MyTasksDesc").($onlyopened?' '.$langs->trans("OnlyOpenedProject"):'').'
'; +if ($mine) print $langs->trans("MyTasksDesc").($onlyopenedproject?' '.$langs->trans("OnlyOpenedProject"):'').'
'; else { - if ($user->rights->projet->all->lire && ! $socid) print $langs->trans("ProjectsDesc").($onlyopened?' '.$langs->trans("OnlyOpenedProject"):'').'
'; - else print $langs->trans("ProjectsPublicTaskDesc").($onlyopened?' '.$langs->trans("AlsoOnlyOpenedProject"):'').'
'; + if ($user->rights->projet->all->lire && ! $socid) print $langs->trans("ProjectsDesc").($onlyopenedproject?' '.$langs->trans("OnlyOpenedProject"):'').'
'; + else print $langs->trans("ProjectsPublicTaskDesc").($onlyopenedproject?' '.$langs->trans("AlsoOnlyOpenedProject"):'').'
'; } if ($mine) { @@ -317,7 +316,7 @@ $startday=dol_mktime(12, 0, 0, $startdayarray['first_month'], $startdayarray['fi for($i=0;$i<7;$i++) { - print '
'.dol_print_date($startday + ($i * 3600 * 24), '%a').'
'.dol_print_date($startday + ($i * 3600 * 24), 'day').'
'.dol_print_date($startday + ($i * 3600 * 24), '%a').'
'.dol_print_date($startday + ($i * 3600 * 24), 'day').'
'.$langs->trans("Total").'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
'.$langs->trans("Ref").''; // Define a complementary filter for search of next/prev ref. if (! $user->rights->projet->all->lire) { - $projectsListId = $object->getProjectsAuthorizedForUser($user,$mine,0); + $projectsListId = $object->getProjectsAuthorizedForUser($user,0,0); $object->next_prev_filter=" rowid in (".(count($projectsListId)?join(',',array_keys($projectsListId)):'0').")"; } print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref'); diff --git a/htdocs/projet/ganttview.php b/htdocs/projet/ganttview.php index 4bafee55e82..091059d76e3 100644 --- a/htdocs/projet/ganttview.php +++ b/htdocs/projet/ganttview.php @@ -109,7 +109,7 @@ if ($id > 0 || ! empty($ref)) // Define a complementary filter for search of next/prev ref. if (! $user->rights->projet->all->lire) { - $projectsListId = $object->getProjectsAuthorizedForUser($user,$mine,0); + $projectsListId = $object->getProjectsAuthorizedForUser($user,0,0); $object->next_prev_filter=" rowid in (".(count($projectsListId)?join(',',array_keys($projectsListId)):'0').")"; } print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref', '', $param); diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index a50595db609..3f9aea52444 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -60,8 +60,6 @@ $offset = $conf->liste_limit * $page ; $pageprev = $page - 1; $pagenext = $page + 1; -$mine = $_REQUEST['mode']=='mine' ? 1 : 0; - $search_all=GETPOST("search_all"); $search_ref=GETPOST("search_ref"); $search_label=GETPOST("search_label"); @@ -75,6 +73,9 @@ $search_user=GETPOST('search_user','int'); $search_sale=GETPOST('search_sale','int'); $optioncss = GETPOST('optioncss','alpha'); +$mine = $_REQUEST['mode']=='mine' ? 1 : 0; +if ($mine) $search_user = $user->id; + $day = GETPOST('day','int'); $month = GETPOST('month','int'); $year = GETPOST('year','int'); @@ -306,7 +307,7 @@ if ($resql) if (empty($conf->global->PROJECT_LIST_HIDE_STARTDATE)) $colspan++; - // If the user can view prospects other than his' + // If the user can view thirdparties other than his' if ($user->rights->societe->client->voir || $socid) { $langs->load("commercial"); diff --git a/htdocs/projet/note.php b/htdocs/projet/note.php index fe6137223d5..45c4cffd65b 100644 --- a/htdocs/projet/note.php +++ b/htdocs/projet/note.php @@ -88,7 +88,7 @@ if ($id > 0 || ! empty($ref)) // Define a complementary filter for search of next/prev ref. if (! $user->rights->projet->all->lire) { - $projectsListId = $object->getProjectsAuthorizedForUser($user,$mine,0); + $projectsListId = $object->getProjectsAuthorizedForUser($user,0,0); $object->next_prev_filter=" rowid in (".(count($projectsListId)?join(',',array_keys($projectsListId)):'0').")"; } print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref'); diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index b73f3456324..63c2bd72f28 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -146,7 +146,7 @@ if ($action == 'createtask' && $user->rights->projet->creer) } else if (empty($projectid)) { - header("Location: ".DOL_URL_ROOT.'/projet/tasks/index.php'.(empty($mode)?'':'?mode='.$mode)); + header("Location: ".DOL_URL_ROOT.'/projet/tasks/list.php'.(empty($mode)?'':'?mode='.$mode)); exit; } $id = $projectid; @@ -162,7 +162,7 @@ if ($action == 'createtask' && $user->rights->projet->creer) else if (empty($id)) { // We go back on task list - header("Location: ".DOL_URL_ROOT.'/projet/tasks/index.php'.(empty($mode)?'':'?mode='.$mode)); + header("Location: ".DOL_URL_ROOT.'/projet/tasks/list.php'.(empty($mode)?'':'?mode='.$mode)); exit; } } @@ -215,7 +215,7 @@ if ($id > 0 || ! empty($ref)) // Define a complementary filter for search of next/prev ref. if (! $user->rights->projet->all->lire) { - $projectsListId = $object->getProjectsAuthorizedForUser($user,$mine,0); + $projectsListId = $object->getProjectsAuthorizedForUser($user,0,0); $object->next_prev_filter=" rowid in (".(count($projectsListId)?join(',',array_keys($projectsListId)):'0').")"; } print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref', '', $param); diff --git a/htdocs/projet/tasks/contact.php b/htdocs/projet/tasks/contact.php index 59dab34b33e..787bc8e120a 100644 --- a/htdocs/projet/tasks/contact.php +++ b/htdocs/projet/tasks/contact.php @@ -173,6 +173,8 @@ if ($id > 0 || ! empty($ref)) { if ($object->fetch($id, $ref) > 0) { + $id = $object->id; // So when doing a search from ref, id is also set correctly. + $result=$projectstatic->fetch($object->fk_project); if (! empty($projectstatic->socid)) $projectstatic->fetch_thirdparty(); diff --git a/htdocs/projet/tasks/document.php b/htdocs/projet/tasks/document.php index 1afc949cfa0..97a09ad1f87 100644 --- a/htdocs/projet/tasks/document.php +++ b/htdocs/projet/tasks/document.php @@ -143,7 +143,7 @@ if ($object->id > 0) // Define a complementary filter for search of next/prev ref. if (! $user->rights->projet->all->lire) { - $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,0); + $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,0); $projectstatic->next_prev_filter=" rowid in (".(count($projectsListId)?join(',',array_keys($projectsListId)):'0').")"; } print $form->showrefnav($projectstatic,'project_ref','',1,'ref','ref','',$param.'&withproject=1'); @@ -203,7 +203,7 @@ if ($object->id > 0) print ''; if (empty($withproject) || empty($projectstatic->id)) { - $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,1); + $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,1); $object->next_prev_filter=" fk_projet in (".$projectsListId.")"; } else $object->next_prev_filter=" fk_projet = ".$projectstatic->id; diff --git a/htdocs/projet/tasks/index.php b/htdocs/projet/tasks/list.php similarity index 84% rename from htdocs/projet/tasks/index.php rename to htdocs/projet/tasks/list.php index cd8e3af37bd..e3540afc1aa 100644 --- a/htdocs/projet/tasks/index.php +++ b/htdocs/projet/tasks/list.php @@ -1,6 +1,6 @@ - * Copyright (C) 2006-2014 Laurent Destailleur + * Copyright (C) 2006-2015 Laurent Destailleur * Copyright (C) 2006-2010 Regis Houssin * * This program is free software; you can redistribute it and/or modify @@ -18,7 +18,7 @@ */ /** - * \file htdocs/projet/tasks/index.php + * \file htdocs/projet/tasks/list.php * \ingroup project * \brief List all task of a project */ @@ -43,6 +43,9 @@ $search_task_label=GETPOST('search_task_label'); $search_project_user=GETPOST('search_project_user'); $search_task_user=GETPOST('search_task_user'); +$mine = $_REQUEST['mode']=='mine' ? 1 : 0; +if ($mine) $search_task_user = $user->id; + // Security check $socid=0; if ($user->societe_id > 0) $socid = $user->societe_id; @@ -54,8 +57,6 @@ $page = GETPOST("page"); $page = is_numeric($page) ? $page : 0; $page = $page == -1 ? 0 : $page; -$mine = $_REQUEST['mode']=='mine' ? 1 : 0; - // Purge criteria if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers { @@ -64,6 +65,8 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETP $search_status=""; $search_task_ref=""; $search_task_label=""; + $search_task_user=-1; + $search_project_user=-1; } if (empty($search_status) && $search_status == '') $search_status=1; @@ -88,6 +91,10 @@ $fieldstosearchall = array( $form=new Form($db); $projectstatic = new Project($db); $taskstatic = new Task($db); +$puser=new User($db); +$tuser=new User($db); +if ($search_project_user > 0) $puser->fetch($search_project_user); +if ($search_task_user > 0) $tuser->fetch($search_task_user); $title=$langs->trans("Activities"); if ($mine) $title=$langs->trans("MyActivities"); @@ -112,6 +119,7 @@ else // Get list of project id allowed to user (in a string list separated by coma) $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,1,$socid); +//var_dump($projectsListId); // Get list of tasks in tasksarray and taskarrayfiltered // We need all tasks (even not limited to a user because a task assigned to a user can have a parent that is not assigned to him and we need such parents). @@ -119,9 +127,9 @@ $morewherefilter=''; if ($search_all) $morewherefilter.=natural_search(array_keys($fieldstosearchall), $search_all); if ($search_task_ref) $morewherefilter.=natural_search('t.ref', $search_task_ref); if ($search_task_label) $morewherefilter.=natural_search('t.label', $search_task_label); + $tasksarray=$taskstatic->getTasksArray(0, 0, $projectstatic->id, $socid, 0, $search_project, $search_status, $morewherefilter, $search_project_user, $search_task_user); -// We load also tasks limited to a particular user -$tasksrole=($mine ? $taskstatic->getUserRolesForProjectsOrTasks(0,$user,$projectstatic->id,0) : ''); +$tasksrole=$taskstatic->getUserRolesForProjectsOrTasks(0, ($tuser->id?$tuser:null), $projectstatic->id, 0, $search_status); // We load also tasks limited to a particular user print ''; if ($optioncss != '') print ''; @@ -130,7 +138,6 @@ print ''; print ''; print ''; print ''; -print ''; if ($search_all) { @@ -140,20 +147,23 @@ if ($search_all) // If the user can view users -if ($user->rights->user->user->lire) -{ - $moreforfilter.='
'; - $moreforfilter.=$langs->trans('ProjectsWithThisUserAsContact'). ' '; - $moreforfilter.=$form->select_dolusers($search_project_user, 'search_project_user', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); - $moreforfilter.='
'; -} -if ($user->rights->user->user->lire) -{ - $moreforfilter.='
'; - $moreforfilter.=$langs->trans('TasksWithThisUserAsContact'). ' '; - $moreforfilter.=$form->select_dolusers($search_task_user, 'search_task_user', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); - $moreforfilter.='
'; -} +//if ($mine) $search_project_user=$user->id; // We want by default all project. "mine" is a filter for task contact on this page +$moreforfilter.='
'; +$moreforfilter.=$langs->trans('ProjectsWithThisUserAsContact'). ' '; +$includeonly=''; +if (empty($user->rights->user->user->lire)) $includeonly=array($user->id); +$moreforfilter.=$form->select_dolusers($search_project_user, 'search_project_user', 1, '', 0, $includeonly, '', 0, 0, 0, '', 0, '', 'maxwidth300'); +$moreforfilter.='
'; + +// If the user can view users +if ($mine) $search_task_user=$user->id; +$moreforfilter.='
'; +$moreforfilter.=$langs->trans('TasksWithThisUserAsContact'). ': '; +$includeonly=''; +if (empty($user->rights->user->user->lire)) $includeonly=array($user->id); +$moreforfilter.=$form->select_dolusers($search_task_user, 'search_task_user', 1, '', 0, $includeonly, '', 0, 0, 0, '', 0, '', 'maxwidth300'); +$moreforfilter.='
'; + if (! empty($moreforfilter)) { print '
'; @@ -217,6 +227,7 @@ else { // Show all lines in taskarray (recursive function to go down on tree) $j=0; $level=0; + //var_dump($tasksarray); $nboftaskshown=projectLinesa($j, 0, $tasksarray, $level, true, 1, $tasksrole, $projectsListId, 0); } diff --git a/htdocs/projet/tasks/note.php b/htdocs/projet/tasks/note.php index ba575be30ad..e62e58df58b 100644 --- a/htdocs/projet/tasks/note.php +++ b/htdocs/projet/tasks/note.php @@ -123,7 +123,7 @@ if ($object->id > 0) // Define a complementary filter for search of next/prev ref. if (! $user->rights->projet->all->lire) { - $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,0); + $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,0); $projectstatic->next_prev_filter=" rowid in (".(count($projectsListId)?join(',',array_keys($projectsListId)):'0').")"; } print $form->showrefnav($projectstatic,'project_ref','',1,'ref','ref','',$param.'&withproject=1'); @@ -175,7 +175,7 @@ if ($object->id > 0) print '
'.$langs->trans("Ref").''; if (empty($withproject) || empty($projectstatic->id)) { - $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,1); + $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,1); $object->next_prev_filter=" fk_projet in (".$projectsListId.")"; } else $object->next_prev_filter=" fk_projet = ".$projectstatic->id; diff --git a/htdocs/projet/tasks/task.php b/htdocs/projet/tasks/task.php index 9cbe8c1289f..32ede58a534 100644 --- a/htdocs/projet/tasks/task.php +++ b/htdocs/projet/tasks/task.php @@ -227,7 +227,7 @@ if ($id > 0 || ! empty($ref)) // Define a complementary filter for search of next/prev ref. if (! $user->rights->projet->all->lire) { - $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,0); + $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,0); $projectstatic->next_prev_filter=" rowid in (".(count($projectsListId)?join(',',array_keys($projectsListId)):'0').")"; } print $form->showrefnav($projectstatic,'project_ref','',1,'ref','ref','',$param.'&withproject=1'); @@ -402,7 +402,7 @@ if ($id > 0 || ! empty($ref)) print ''; if (! GETPOST('withproject') || empty($projectstatic->id)) { - $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,1); + $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,1); $object->next_prev_filter=" fk_projet in (".$projectsListId.")"; } else $object->next_prev_filter=" fk_projet = ".$projectstatic->id; diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 6c250d0fe57..51dafba2a6d 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -237,7 +237,7 @@ if ($id > 0 || ! empty($ref)) // Define a complementary filter for search of next/prev ref. if (! $user->rights->projet->all->lire) { - $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,0); + $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,0); $projectstatic->next_prev_filter=" rowid in (".(count($projectsListId)?join(',',array_keys($projectsListId)):'0').")"; } print $form->showrefnav($projectstatic,'project_ref','',1,'ref','ref','',$param.'&withproject=1'); @@ -296,7 +296,7 @@ if ($id > 0 || ! empty($ref)) print ''; if (! GETPOST('withproject') || empty($projectstatic->id)) { - $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,$mine,1); + $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,1); $object->next_prev_filter=" fk_projet in (".$projectsListId.")"; } else $object->next_prev_filter=" fk_projet = ".$projectstatic->id; diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index f0f031114e5..5587efa2431 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -282,6 +282,10 @@ input.removedassigned { vertical-align: text-bottom; margin-bottom: -3px; } +input.smallpadd { + padding-left: 0px !important; + padding-right: 0px !important; +} select.flat, form.flat select { diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 261a288ddc3..56df547b9b1 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -276,6 +276,10 @@ input.removedassigned { vertical-align: text-bottom; margin-bottom: -3px; } +input.smallpadd { + padding-left: 1px !important; + padding-right: 1px !important; +} select.flat, form.flat select { From 955fad910d14b6df467bde90379fe9ff67562ef9 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Fri, 4 Dec 2015 17:32:17 +0100 Subject: [PATCH 120/206] FIX : Bug: $this is not accessible in static context in Mailing::libStatutDest #4050 --- htdocs/comm/mailing/class/mailing.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/mailing/class/mailing.class.php b/htdocs/comm/mailing/class/mailing.class.php index a69909a1ef3..be12b3b3f30 100644 --- a/htdocs/comm/mailing/class/mailing.class.php +++ b/htdocs/comm/mailing/class/mailing.class.php @@ -556,11 +556,11 @@ class Mailing extends CommonObject if ($mode == 0) { - return $langs->trans($this->statut_dest[$statut]); + return $langs->trans('MailingStatusError'); } if ($mode == 1) { - return $langs->trans($this->statut_dest[$statut]); + return $langs->trans('MailingStatusSent'); } if ($mode == 2) { From 1dfd3f396e0924ca9b92a624cacc6f537fc75663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 4 Dec 2015 14:06:53 +0100 Subject: [PATCH 121/206] Fixed md theme name --- htdocs/theme/md/graph-color.php | 4 ++-- htdocs/theme/md/style.css.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/theme/md/graph-color.php b/htdocs/theme/md/graph-color.php index 4346d007158..3450180e153 100644 --- a/htdocs/theme/md/graph-color.php +++ b/htdocs/theme/md/graph-color.php @@ -17,8 +17,8 @@ */ /** - * \file htdocs/theme/eldy/graph-color.php - * \brief File to declare colors to use to build graphics with theme Eldy + * \file htdocs/theme/md/graph-color.php + * \brief File to declare colors to use to build graphics with theme Material Design * \ingroup core * * To include file, do this: diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 56df547b9b1..a7a191f45bb 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -61,7 +61,7 @@ $right=($langs->trans("DIRECTION")=='rtl'?'left':'right'); $left=($langs->trans("DIRECTION")=='rtl'?'right':'left'); $path=''; // This value may be used in future for external module to overwrite theme -$theme='eldy'; // Value of theme +$theme='md'; // Value of theme if (! empty($conf->global->MAIN_OVERWRITE_THEME_RES)) { $path='/'.$conf->global->MAIN_OVERWRITE_THEME_RES; $theme=$conf->global->MAIN_OVERWRITE_THEME_RES; } // Define image path files and other constants From a8f67808de3707f66f5f65803f933512ba16fb9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 4 Dec 2015 17:58:37 +0100 Subject: [PATCH 122/206] NEW Used matching icons for Material Design theme Icons from https://www.google.com/design/icons/ Licenced under CC BY 4.0 --- htdocs/theme/md/img/calendar.png | Bin 250 -> 106 bytes htdocs/theme/md/img/close.png | Bin 301 -> 148 bytes htdocs/theme/md/img/close_title.png | Bin 240 -> 148 bytes htdocs/theme/md/img/delete.png | Bin 202 -> 130 bytes htdocs/theme/md/img/disable.png | Bin 245 -> 248 bytes htdocs/theme/md/img/edit.png | Bin 818 -> 148 bytes htdocs/theme/md/img/edit_add.png | Bin 220 -> 97 bytes htdocs/theme/md/img/edit_remove.png | Bin 122 -> 81 bytes htdocs/theme/md/img/editdelete.png | Bin 245 -> 202 bytes htdocs/theme/md/img/error.png | Bin 489 -> 201 bytes htdocs/theme/md/img/file.png | Bin 505 -> 109 bytes htdocs/theme/md/img/filenew.png | Bin 397 -> 166 bytes htdocs/theme/md/img/filter.png | Bin 237 -> 106 bytes htdocs/theme/md/img/folder-open.png | Bin 801 -> 104 bytes htdocs/theme/md/img/folder.png | Bin 935 -> 99 bytes htdocs/theme/md/img/grip.png | Bin 90 -> 83 bytes htdocs/theme/md/img/grip_title.png | Bin 90 -> 83 bytes htdocs/theme/md/img/helpdoc.png | Bin 307 -> 267 bytes htdocs/theme/md/img/high.png | Bin 611 -> 197 bytes htdocs/theme/md/img/history.png | Bin 1362 -> 270 bytes htdocs/theme/md/img/info.png | Bin 657 -> 254 bytes htdocs/theme/md/img/info_black.png | Bin 312 -> 207 bytes htdocs/theme/md/img/lock.png | Bin 646 -> 206 bytes htdocs/theme/md/img/menus/README.md | 12 ------------ htdocs/theme/md/img/menus/agenda.png | Bin 700 -> 131 bytes htdocs/theme/md/img/menus/agenda_over.png | Bin 541 -> 0 bytes htdocs/theme/md/img/menus/bank.png | Bin 827 -> 158 bytes htdocs/theme/md/img/menus/bank_over.png | Bin 620 -> 0 bytes htdocs/theme/md/img/menus/chart.png | Bin 1321 -> 127 bytes htdocs/theme/md/img/menus/commercial.png | Bin 845 -> 133 bytes htdocs/theme/md/img/menus/commercial_over.png | Bin 638 -> 0 bytes htdocs/theme/md/img/menus/company.png | Bin 572 -> 105 bytes htdocs/theme/md/img/menus/company_over.png | Bin 406 -> 0 bytes htdocs/theme/md/img/menus/ecm.png | Bin 912 -> 178 bytes htdocs/theme/md/img/menus/ecm_over.png | Bin 647 -> 0 bytes htdocs/theme/md/img/menus/externalsite.png | Bin 531 -> 124 bytes .../theme/md/img/menus/externalsite_over.png | Bin 404 -> 0 bytes htdocs/theme/md/img/menus/ftp.png | Bin 788 -> 92 bytes htdocs/theme/md/img/menus/ftp_over.png | Bin 563 -> 0 bytes htdocs/theme/md/img/menus/generic1.png | Bin 570 -> 133 bytes htdocs/theme/md/img/menus/generic1_over.png | Bin 486 -> 0 bytes htdocs/theme/md/img/menus/generic2.png | Bin 570 -> 133 bytes htdocs/theme/md/img/menus/generic2_over.png | Bin 548 -> 0 bytes htdocs/theme/md/img/menus/generic3.png | Bin 570 -> 133 bytes htdocs/theme/md/img/menus/generic3_over.png | Bin 486 -> 0 bytes htdocs/theme/md/img/menus/generic4.png | Bin 570 -> 133 bytes htdocs/theme/md/img/menus/generic4_over.png | Bin 486 -> 0 bytes htdocs/theme/md/img/menus/globe.png | Bin 1175 -> 390 bytes htdocs/theme/md/img/menus/globe_over.png | Bin 844 -> 0 bytes htdocs/theme/md/img/menus/holiday.png | Bin 1086 -> 308 bytes htdocs/theme/md/img/menus/home.png | Bin 679 -> 94 bytes htdocs/theme/md/img/menus/home_over.png | Bin 484 -> 0 bytes htdocs/theme/md/img/menus/mail.png | Bin 718 -> 211 bytes htdocs/theme/md/img/menus/mail_over.png | Bin 534 -> 0 bytes htdocs/theme/md/img/menus/members.png | Bin 1044 -> 145 bytes htdocs/theme/md/img/menus/members_over.png | Bin 720 -> 0 bytes htdocs/theme/md/img/menus/money.png | Bin 1259 -> 179 bytes htdocs/theme/md/img/menus/money_over.png | Bin 940 -> 0 bytes htdocs/theme/md/img/menus/pointofsale.png | Bin 542 -> 131 bytes htdocs/theme/md/img/menus/pointofsale_over.png | Bin 424 -> 0 bytes htdocs/theme/md/img/menus/products.png | Bin 510 -> 84 bytes htdocs/theme/md/img/menus/products_over.png | Bin 358 -> 0 bytes htdocs/theme/md/img/menus/project.png | Bin 449 -> 156 bytes htdocs/theme/md/img/menus/project_over.png | Bin 360 -> 0 bytes htdocs/theme/md/img/menus/shop.png | Bin 679 -> 259 bytes htdocs/theme/md/img/menus/shop_over.png | Bin 502 -> 0 bytes htdocs/theme/md/img/menus/tools.png | Bin 1052 -> 239 bytes htdocs/theme/md/img/menus/tools_over.png | Bin 706 -> 0 bytes htdocs/theme/md/img/next.png | Bin 622 -> 118 bytes htdocs/theme/md/img/object_account.png | Bin 453 -> 182 bytes htdocs/theme/md/img/object_accounting.png | Bin 170 -> 161 bytes htdocs/theme/md/img/object_action.png | Bin 528 -> 113 bytes htdocs/theme/md/img/object_action_rdv.png | Bin 675 -> 118 bytes htdocs/theme/md/img/object_address.png | Bin 358 -> 227 bytes htdocs/theme/md/img/object_bill.png | Bin 394 -> 146 bytes htdocs/theme/md/img/object_billa.png | Bin 395 -> 146 bytes htdocs/theme/md/img/object_billd.png | Bin 341 -> 146 bytes htdocs/theme/md/img/object_billr.png | Bin 399 -> 146 bytes htdocs/theme/md/img/object_bookmark.png | Bin 201 -> 131 bytes htdocs/theme/md/img/object_building.png | Bin 563 -> 122 bytes htdocs/theme/md/img/object_calendar.png | Bin 199 -> 106 bytes htdocs/theme/md/img/object_calendarday.png | Bin 223 -> 165 bytes htdocs/theme/md/img/object_calendarperuser.png | Bin 198 -> 106 bytes htdocs/theme/md/img/object_calendarweek.png | Bin 188 -> 156 bytes .../theme/md/img/object_category-expanded.png | Bin 295 -> 104 bytes htdocs/theme/md/img/object_category.png | Bin 281 -> 99 bytes htdocs/theme/md/img/object_commercial.png | Bin 304 -> 147 bytes htdocs/theme/md/img/object_company.png | Bin 492 -> 122 bytes htdocs/theme/md/img/object_contact.png | Bin 666 -> 280 bytes htdocs/theme/md/img/object_contact_all.png | Bin 810 -> 170 bytes htdocs/theme/md/img/object_contract.png | Bin 359 -> 134 bytes htdocs/theme/md/img/object_cron.png | Bin 433 -> 284 bytes htdocs/theme/md/img/object_dir.png | Bin 301 -> 99 bytes htdocs/theme/md/img/object_email.png | Bin 368 -> 189 bytes htdocs/theme/md/img/object_energie.png | Bin 376 -> 158 bytes htdocs/theme/md/img/object_generic.png | Bin 361 -> 109 bytes htdocs/theme/md/img/object_globe.png | Bin 366 -> 305 bytes htdocs/theme/md/img/object_group.png | Bin 655 -> 170 bytes htdocs/theme/md/img/object_holiday.png | Bin 771 -> 251 bytes htdocs/theme/md/img/object_intervention.png | Bin 340 -> 270 bytes htdocs/theme/md/img/object_invoice.png | Bin 394 -> 146 bytes htdocs/theme/md/img/object_label.png | Bin 769 -> 158 bytes htdocs/theme/md/img/object_list.png | Bin 179 -> 83 bytes htdocs/theme/md/img/object_margin.png | Bin 571 -> 92 bytes htdocs/theme/md/img/object_opensurvey.png | Bin 743 -> 103 bytes htdocs/theme/md/img/object_order.png | Bin 357 -> 146 bytes htdocs/theme/md/img/object_payment.png | Bin 339 -> 221 bytes htdocs/theme/md/img/object_phoning.png | Bin 577 -> 200 bytes htdocs/theme/md/img/object_printer.png | Bin 296 -> 167 bytes htdocs/theme/md/img/object_product.png | Bin 559 -> 150 bytes htdocs/theme/md/img/object_project.png | Bin 926 -> 158 bytes htdocs/theme/md/img/object_projectpub.png | Bin 929 -> 158 bytes htdocs/theme/md/img/object_projecttask.png | Bin 941 -> 216 bytes htdocs/theme/md/img/object_propal.png | Bin 284 -> 146 bytes htdocs/theme/md/img/object_reduc.png | Bin 361 -> 221 bytes htdocs/theme/md/img/object_resource.png | Bin 199 -> 227 bytes htdocs/theme/md/img/object_sending.png | Bin 273 -> 173 bytes htdocs/theme/md/img/object_service.png | Bin 365 -> 161 bytes htdocs/theme/md/img/object_stock.png | Bin 554 -> 91 bytes .../theme/md/img/object_supplier_proposal.png | Bin 284 -> 146 bytes htdocs/theme/md/img/object_task.png | Bin 176 -> 216 bytes htdocs/theme/md/img/object_task_time.png | Bin 199 -> 116 bytes htdocs/theme/md/img/object_technic.png | Bin 433 -> 256 bytes htdocs/theme/md/img/object_trip.png | Bin 337 -> 221 bytes htdocs/theme/md/img/object_user.png | Bin 581 -> 164 bytes htdocs/theme/md/img/off.png | Bin 568 -> 248 bytes htdocs/theme/md/img/on.png | Bin 603 -> 230 bytes htdocs/theme/md/img/play.png | Bin 653 -> 131 bytes htdocs/theme/md/img/previous.png | Bin 620 -> 114 bytes htdocs/theme/md/img/printer.png | Bin 329 -> 167 bytes htdocs/theme/md/img/puce.png | Bin 504 -> 193 bytes htdocs/theme/md/img/recent.png | Bin 447 -> 165 bytes htdocs/theme/md/img/refresh.png | Bin 722 -> 205 bytes htdocs/theme/md/img/reload.png | Bin 704 -> 205 bytes htdocs/theme/md/img/rightarrow.png | Bin 156 -> 142 bytes htdocs/theme/md/img/searchclear.png | Bin 356 -> 143 bytes htdocs/theme/md/img/setup.png | Bin 702 -> 256 bytes htdocs/theme/md/img/split.png | Bin 195 -> 153 bytes htdocs/theme/md/img/star.png | Bin 381 -> 175 bytes htdocs/theme/md/img/switch_off.png | Bin 1252 -> 292 bytes htdocs/theme/md/img/switch_on.png | Bin 1228 -> 257 bytes htdocs/theme/md/img/tick.png | Bin 227 -> 140 bytes htdocs/theme/md/img/title_accountancy.png | Bin 1019 -> 218 bytes htdocs/theme/md/img/title_bank.png | Bin 796 -> 216 bytes htdocs/theme/md/img/title_commercial.png | Bin 828 -> 176 bytes htdocs/theme/md/img/title_companies.png | Bin 562 -> 146 bytes htdocs/theme/md/img/title_generic.png | Bin 789 -> 197 bytes htdocs/theme/md/img/title_home.png | Bin 721 -> 126 bytes htdocs/theme/md/img/title_hrm.png | Bin 1028 -> 447 bytes htdocs/theme/md/img/title_products.png | Bin 678 -> 107 bytes htdocs/theme/md/img/title_project.png | Bin 604 -> 237 bytes htdocs/theme/md/img/title_setup.png | Bin 1105 -> 453 bytes htdocs/theme/md/img/unlock.png | Bin 686 -> 212 bytes htdocs/theme/md/img/vcard.png | Bin 566 -> 230 bytes htdocs/theme/md/img/view.png | Bin 708 -> 204 bytes htdocs/theme/md/img/warning.png | Bin 480 -> 169 bytes 156 files changed, 12 deletions(-) delete mode 100644 htdocs/theme/md/img/menus/README.md delete mode 100644 htdocs/theme/md/img/menus/agenda_over.png delete mode 100644 htdocs/theme/md/img/menus/bank_over.png delete mode 100644 htdocs/theme/md/img/menus/commercial_over.png delete mode 100644 htdocs/theme/md/img/menus/company_over.png delete mode 100644 htdocs/theme/md/img/menus/ecm_over.png delete mode 100644 htdocs/theme/md/img/menus/externalsite_over.png delete mode 100644 htdocs/theme/md/img/menus/ftp_over.png delete mode 100644 htdocs/theme/md/img/menus/generic1_over.png delete mode 100644 htdocs/theme/md/img/menus/generic2_over.png delete mode 100644 htdocs/theme/md/img/menus/generic3_over.png delete mode 100644 htdocs/theme/md/img/menus/generic4_over.png delete mode 100644 htdocs/theme/md/img/menus/globe_over.png delete mode 100644 htdocs/theme/md/img/menus/home_over.png delete mode 100644 htdocs/theme/md/img/menus/mail_over.png delete mode 100644 htdocs/theme/md/img/menus/members_over.png delete mode 100644 htdocs/theme/md/img/menus/money_over.png delete mode 100644 htdocs/theme/md/img/menus/pointofsale_over.png delete mode 100644 htdocs/theme/md/img/menus/products_over.png delete mode 100644 htdocs/theme/md/img/menus/project_over.png delete mode 100644 htdocs/theme/md/img/menus/shop_over.png delete mode 100644 htdocs/theme/md/img/menus/tools_over.png diff --git a/htdocs/theme/md/img/calendar.png b/htdocs/theme/md/img/calendar.png index bbe6c27f041005fec8f47099cdfc7ebb1053af89..98a013a40148fb41b2ab42dcdd6d609ee7d4016f 100644 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|m3_V>OLn;`P6?p%!JJr;*O?F^> z^MPfO-kk|yT^ks7X*lgjdmx&~WW@BD#ZT2;as?N|{j|2(T&kIoK+O!Eu6{1-oD!M< DhNT`A literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF-L1;Fyx1l&avFo0y&&l$w}QS$Hzl2B=6bz$e6Yj$!i5ng7$$&KMidOiN1x z3eTK5^URqu|Ns97vEQ<#04c7LAirRs2m~-}I-_$QDC*m6etrEsGhoSd$f&1eESHS~9)aVU~6?Hw(kkO9vFD hCT3}{7@TQgVz@7DWWGTr!y0HVgQu&X%Q~loCIG~bR}%mL diff --git a/htdocs/theme/md/img/close.png b/htdocs/theme/md/img/close.png index ec4338e8bca2ad6905cee379100a8b0becfa5c9d..f2b546002f285e85f71d736d5e31b80a5d1c2b2a 100644 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mqCH(4Ln;`LPO#=`Fc4sUo+tJ( zt?rtNdtFoOhlJ*Yg~3ZC(h|-8xK^4OKQg#1D9k4ss2k~-(NU%@-FNo;>$_*wXL3}C vRtg`sf9cDpZZRUqP%yB>=-2k5u*9j9Q{Qv(SND>1Q&YblEYUC>k z@(Tu9%EZjV%ErOT#UmnV`TC3^P=+zd+ueonKa=h~ASd3_#W95Ada^(Q1EU+;vEbEW zPu2+~y+{)g5t%aU&;f2PY<8T@`xzsDz6okAy^sBxB$|;k(yA$2|pF#o+1c=d#Wzp$Pzd CFk~nI diff --git a/htdocs/theme/md/img/close_title.png b/htdocs/theme/md/img/close_title.png index bebb74d98611e818118d81d55d5dfc5eb62f15cb..f2b546002f285e85f71d736d5e31b80a5d1c2b2a 100644 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mqCH(4Ln;`LPO#=`Fc4sUo+tJ( zt?rtNdtFoOhlJ*Yg~3ZC(h|-8xK^4OKQg#1D9k4ss2k~-(NU%@-FNo;>$_*wXL3}C vRtg z6*G2wc!SI;3GxeOU|?ioW?^OH;N;>Fk+gh$MiD3z=jq}Y!f`#e&ynwt0}pe$*KS?5 zDS!TNmDwgLTHN*Kh+&cQhq)>}{*MlQJT%!Rd;#~tb(QArnoPG+r_VB8xBE%a!qqIy zPqzONpL%f8?Zu3i>!dbp=9>A2@6H3p1DhU-hp908`MOQ81=_^m>FVdQ&MBb@0C+cC ALjV8( diff --git a/htdocs/theme/md/img/delete.png b/htdocs/theme/md/img/delete.png index 8ad73597be74e4690e6a5b354ceb560c5542ab0b..2482989b0cc5112cf6608b337b1480f45f866081 100644 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mJUv|;Ln;`P7YG_8-8f#r!10|i zGNOU`aJ|k2#?XmO&dg#f8uG%J4l|m}Xvj=tZcF8j5b4#@Iu;Ppv9e=+BBNKu`Q!(S c>$sR0e4iEg$*=gl5ojobr>mdKI;Vst0L4Kk#sB~S literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^d?3sLBp9rei+F()Q%R6tFvI`oiAr06yk<`q#}E!# z)`N;s%!VRt2X58~MvBW+v*_@tY%141&JfP&u95fn-uqK$zMc4W(rWVb(+k!cR|mxJ z^m$tzFB)-O`mf#b8~&o4w%=oy2BluOzi)Zy>p#)*>$g1q`B&nYoy=r2mSb}+tZ)&! zpu&2Rw^#Ima4(nE#@t;xldeSO+&+AnL+J;5+70jW&LcYOL5}ov^>bP0l+XkKHit`# diff --git a/htdocs/theme/md/img/disable.png b/htdocs/theme/md/img/disable.png index f8c84994d473348e27391c7095c451fdfac9e0fb..9bab123aca7f214c66ac06f8a1635eed9d8ee9e9 100644 GIT binary patch literal 248 zcmVtP9`U%sl=ukMXKL^sa7h zE;^M5z1y1#k9xBb`7u4(@gCcop18|hMDS@P{Y^>ZAdXf*FQ63~Nm64i(j9OWYqG#X zjiphfXW(YaSWQO4!!xLrN{CB=EVXDdb^^LsHE}4qX(P1(s%YR~9h0Q>6)!L+KjDeD yvSyC|BH!M)$9iJ{jJ72LRCdk=gOiQ9*YpbvQLBz5<54^S0000}RC_ literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCTmyVUT>t<7A5^?{&enU+-+#Y$ z@BKL-y7vCqwfB3^J#S%Pc>n(U`|9j-PKK62#rK|n|9|Y5SN2k`mdKI;Vst0EA$6kN^Mx diff --git a/htdocs/theme/md/img/edit.png b/htdocs/theme/md/img/edit.png index 4e916fe1fb095017458fcdd1093c1efb8cc8afca..7012f52be5ae6acc556b223c8a822b5883ce62ac 100644 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mqCH(4Ln;`Lp1sT2U?9Nqu=8rf z^r*=!AD5dsZs_jzo_AJKpz!(E=BIb1%=n_@byZ4#tvPIT+uMCJ$CsJC-&0f*l?((p wRTmiu9#HQ3;iGn_zeUQ4cVSzAg8Un%*?FG5yS!Xx0j**1boFyt=akR{0I#7l!~g&Q literal 818 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD>a4GV=%;&YExV7AVA7 z;1OBOz`*qZgc+UIn9KkQvZOouIx;Y9?C1WI$jZRL*c{*!;ws9^Atk^mDJ~)_Dj+7O zsU|CJpr@&B=3yC7=3!@E7o;EN?HCdoUJ~VA9PN{kkdU69?w#D@m%A{yctuXz#;opx z4Z-@2AqEX0#?xwY*OY~Bu5{R3<+Q8LxvQyiPpk9ZR+qgkZu?uj_ILQ~@AX;Kl)Jb& zXH{$Z>b8tEz2)0m^0xHVZt1T-(CK@i%fG#?rMYiGOaH?5iHlk%E$g1Tq;LAtsSCEu zS+a52%Jti}ZJ)L2_L2=pSM9yKW8cZ`hp+89a&gCzn>$ZE+kN`k-qTO^oq4|R?DK<5 zr(9mz^XT;2C&#uvKC|KR*$t1+1JS1I7p@#U|Ki|<7e_C>I(GT>u`91nUVC%;`kS*i zUY)u5_WZ4P=WoBebm#r0yYH{ueSh!X(;E-o-+uV!)}!~=AAGp+@Z;^rpYA>V{N~2V zw|CAwzkBV)qlXV)e0lux%i~vHp1k_{?Df}YZ@#{K`|ahsZ?E2cfA#+R>kmKPe*E$7 z)6Xw&AAfoG@WbbyAHV$i{PowDZ@<6&`2F+epP#?}{QCX(|NsB|svmCvqo=VX$S)Yk z9ZBM7ypktPLx;Tb#Tu;u(*wDoEkgYVIO=0`KT}tXUM^3q&brwIfcGZbq4#B{$ zSA!XfwY9mD4w=+W6-{xtbL&*sAq#VTS5`?wf$hsSEz($gCf0LSx8RYrdS}mTeZMkk zQbHa>p||&@KU;p@sE}znc&Dq0#nO+lI^A87!~FE5lh@AOIx~a$jBe-k?FOcXMkWmf z-IIkDJ2x}O%vGrRJV|J=Q}dr#nS(KjEEx<8C2Opk4=Sa713H+&)78&qol`;+02Orb Ay#N3J diff --git a/htdocs/theme/md/img/edit_add.png b/htdocs/theme/md/img/edit_add.png index ae205e9d77050e9de7990790a6328bb58b008ad7..84a1e05229a10ad64bf63c1fd77dbae9aef24c84 100644 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mG(24#Ln;`PB{C8iT38M;D#*xm u@iYVp{9xor%we7+%Dd-1hx_RRObkpVvW_d}b+7~VFnGH9xvX?NMQuIyKMSVXkt-|s8^4;11o z@Q5sCVBq=y!i-L9OlANDS<)SS9T^xl_H+M9WCik70(?STfiwdL2nYyB0D&b4I9WP@ zffoq;|Np;V+Ho~d8Ba-&Uoemh0}Mj<&z%E`D|@;)hHzX@zOlEu{M);`JPxa*#kcC} k)>cMI#i=^1l5%2XWMJB4D7$wV=Qfaap00i_>zopr0O{62WB>pF diff --git a/htdocs/theme/md/img/edit_remove.png b/htdocs/theme/md/img/edit_remove.png index bc4bdb360faaf5046d321966748582f0d44e9551..0725e5fc1558c11c816567ff93a962450a1376f1 100644 GIT binary patch literal 81 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mBs^UlLn;`P6*zmCnA?~m7BF^p daWn@qFjOq#Kj?ii_AyWmgQu&X%Q~loCIFHg6L0_k literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=%3?!FCJ6-`&`~f~8u9hI+Wa$I~|NsAwewbtg zlwvIj@(TuX|1yM~K^3K%?H L{an^LB{Ts5Ee|4s diff --git a/htdocs/theme/md/img/editdelete.png b/htdocs/theme/md/img/editdelete.png index f8c84994d473348e27391c7095c451fdfac9e0fb..1fd90502328debaba9b7e16e00a2b47a9848e03b 100644 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mCVIL!hEy<4J$I3_*+9hY;pS%Z zUCtY=OE`|2)?8krr1UQAt-woXF2xh7OBUU)45~Zv)Xus6=q1IJ&^0w54Uao{K03)h ze@pPt<7A5^?{&enU+-+#Y$ z@BKL-y7vCqwfB3^J#S%Pc>n(U`|9j-PKK62#rK|n|9|Y5SN2k`mdKI;Vst0EA$6kN^Mx diff --git a/htdocs/theme/md/img/error.png b/htdocs/theme/md/img/error.png index f41dd8a3bc02959bdf97c4334d9df8eb5b3209d7..0d9cf16f4a2139bea02e90c58b9108e8456db13c 100644 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mCV09yhEy<4JsarN;2`4m@V#!f zw&+yvvqr7cgd8u332iK8;WVABaOA|33D0d}E&f~&)VnKLqq8q_&gm6fnr8fXd+nrI zrPx!urIG6IZfq#pTG{f1ORpj9%%YrZ9XDnJ@x|x=yBHgEvbrzO*SpJHs>ro2vQnh{ z&7Y!YU(Y`|s_8jxE$dz{x3%BjWfy*WaLlld;c3S%R&&uQAAoLS@O1TaS?83{1OT-h BQPThb literal 489 zcmVPx#?NCfqMdcnttpFfd_QR%cjO@G~>&H8$!tHtRMv={Ps- zKR)V0K<-RU?M_H?Z*A{SP4!Pt^H5OlS5Wd+Qtnty@mNyvTu_31dhlRZ!)B^sueV!oK>pvHQ5P`N6;N z&C2l3%Kg{W@88?@-rMis-0$Px@8sb6GbaG_3rHY^z#IstXTj600DGTPE!Ct z=GbNc0004EOGiWihy@);00009a7bBm000W`000W`0Ya=am;e9(2XskIMF-am0uKZV zBlF0b0001JNklPH|`)TKC4j%){7qahG30Xwj6GBWw(PPOFTUDu!ML>SyqD^>bP0 Hl+XkKHBuqP literal 505 zcmVcs?$o~S)xOTo&eh4l*U!n`-rn%p z#qit5@!H4n+sE?V%i`eP=iu4$;Lq~l(DUKZ^yAg^gxCF;rHy~`0V2N?c@3G=K1gE`tj=e@$35X?E3TU`t$Aj_3!re_51em`}Xqt z_w)St_5Atu{rma;{QLa;{Qmv?{{8*_{{H{|{{R2~F46lN00003bW%=J|Nj8j$_+sP z004bSL_t&t*JEH}QUn4ne-0)PU;uLc{ryc@Abcp-i&f5_g8|O`1p5#;CPhHx3+fQbnJkq;FBHu+v{00000NkvXXu0mjf4ImsM diff --git a/htdocs/theme/md/img/filenew.png b/htdocs/theme/md/img/filenew.png index 8680cce82bff07a3c3aa496e6280d871bcc50e27..93165497458917b4b2fdb26a301e2195f801f9a9 100644 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|may?xfLn;`P6;qC7deI-gV#sLmPKPPKoObf$fW!6jYXQ zqzJ~jK4=JGa8l@v78FuAXLU+6mchw_-?+)}p>2#OE8}X(5D$+WhGy^nO~-=b_W>(B7$jgAWm)~bx@FGV zt>@P6J+~Ezj$PY(?Aoz&Ky>fiH6VI^4T$bNzXwFmf$05nAbJl(-`~Ig4hH}KPht3f zjN$)(iU0qj{{Qd!|9|WM|L6Yy|DTex{x8rv#gZVuU?3MSV3>dKf+A3HgQtsQh{Wa4 zbGP|g6nIzydX|0fpc76wmOKbLh*2~7Yy7Qm|j diff --git a/htdocs/theme/md/img/filter.png b/htdocs/theme/md/img/filter.png index ee34a22c78e0cd31d74739b7cb8a1bda9aa6e608..43d05a50940d1b364d1dc00f731a952503ab19a4 100644 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|m3_V>OLn;`PCAKIuE@Wi)anP_j z@Ijv4#=*K=)}fj6h~^^842J4GjQf??0|b~(I`T7w9a1xn75H`$sF}gj)z4*}Q$iB} D{C^vD literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^_!2%@pE-d!}QcOwS?k)`f+xyS#2l6-zJR*x3 z7`TN&n2}-D90{Nxdx@v7EBk#eCSE;pf6mhzopr0Ca^+T>t<8 diff --git a/htdocs/theme/md/img/folder-open.png b/htdocs/theme/md/img/folder-open.png index 1db8369b3d571114205b1df33c74356590be04e2..b0292d92aaec99817b1a0dff1c1c354cd715f10c 100644 GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|m^gUf1Ln;`PB{&KuJ+zlGdl0}p zNoCC&d%ub%3D^IDqKS-$-31>iSTqKo3}pMo%up#7bIe~t{RvPjgQu&X%Q~loCIBni B9XbF2 literal 801 zcmV++1K#|JP)uLOet000SaNLh0L01EH`01EH{Laa2H00004XF*Lt006O%3;baP00088NklN@N0II}yuGrygg4pDTd@9A^-+&*7||4r~iYQN=fiiP9h zpsQa_esycI_F-xA@;hDmw8n!IP#$O|l1maSBS)FZOv;ObD{(H|-5oz2s0|&_4StVR zlJe=5`8HTH59!Wfip` zkqE#GeCMv3-5t^L<9;8h63RqUfap)Afkhc)bqi250>gCRScH-?w~x?J)PdK{5xdx4 z?cu#3AhrXT41^L8wFnd$;8*~d4O2G&Dv93eP(pO?3GkGu0#7-Ix{NOL$4o0;y2QTL96dP9BifKH`K-62F{z)~8>Xh2?ZVCQYr`wW~p zl*2%;hBBJR?95D(%4vnQbR67W8K~N2*c{!`fwe54sDNMr`|3&<=q@_(P|lj3{l4+= z@$2E~sWf3z81qawKetWi?PW^j~?8boqBss zSLf%bZJCy)Wb>hDS7Li07`MT34SwM8PM|edu*WCnR`1?_{^Z${p(`tk@1I*Nl>%&= z0)XX^f+a*qsJ5ZCv$10Pz6gj51@rpt(ec5XLsut0yc|+9^Roae{x0&D$c)mKYAAd~ zw7Ml)laQ0^>Ww=i!-H2YTwMP4@s&}KHvr4}J7w~RIEe;geO>KcJ*TwIrMaoG(UF`o fvkbug*9U$A&+a%yVRe1!00000NkvXXu0mjf8@zTZ diff --git a/htdocs/theme/md/img/folder.png b/htdocs/theme/md/img/folder.png index 04a24af2e22a3ef25a986218506e1cbf0147db71..fb51c4b100c90c3e1bcb801cd16e0226cd598516 100644 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mv^-rLLn;`PB{&KuJ+zlGdl0}p wNoCC&d%ub%3D^G!lvNA9*UJvjIaRrKVaq%&5NOSWD^YV-F z2}lSCii?WLGH@s|bE`3MX)$tZG4g6N^J=m1YAGt~DXSWY>iVf^Ir#)vv#NG*YjtvJ z_3&tS^6GT)>2&k!^$6(q3hMU>8uW=jr7}^)jD2ht6{eo$DCAH7>b5K4(f``Zni`i(%zQBC8Jg z*E}k2SY6q+vASiKXUo;F?yHd#Z%0qQ6*J|Id&_(O{*M7&ALA!H$((gJd*-{G1^2TS zf6ra=BX|AZx|I(r*M4g1+uk*GU)$VsJ(CYim~n9OtfSNBo|rcObj!k9?JMt3S#W&r zigOdz-JQ4WLgSi;Eh`_itbNqK_EF3FuPqy1we9-Tx${fMou)UCaAn2jtGjofU9$VphTV_a5B!~R@aL>Ezjq(Fz3&%;7XWs6(_-^CH54*2@*!uYI?kE5DKmBv$=+$%Q?;Jbz=)jpb z=dQjwd-KzU%P(%+cyjB`+cR%|-F*7<>X-jFfBb*)||Nq}mvhV;#?c97?Y5;TL;@{F-lWpgI zHMu%9w6SaNZ>iJVkM8RDY~AW`XGY{@^>1Zco~F9BN-*tA+?;-Xo@J_2xOZ_M=Y;He qbLY+#6@2$RJ2jKcxArhC9|D11-HZTm(u>AP{ n$o~~8j&pndx6j^~;=#l)kz2v^P&CIwpkfA3S3j3^P6cxArhC9f1GcSHVV-BS%0YB nL`cz+QK!L&FF4tAItxSR?As|PT~pTp6*G9c`njxgN@xNAn@ku= diff --git a/htdocs/theme/md/img/helpdoc.png b/htdocs/theme/md/img/helpdoc.png index 435fbc77985db9e7d9c970dbdcc40d469c3551a7..1d194e23ec2bf3e3c45233091d06f25c21006610 100644 GIT binary patch delta 239 zcmVz#az&b2U z2qCxyH{cEoYd~-jqljcOd6`MZ;-6da?&Ido<#ZxSnq4J|AQudLvsr0+V(>}%GCx;F zK3L7Xka$;YWFiINn#uT?2w|{~+;iY{*MSGS>7=f7x#ih>pJ+IfZVE%m=IMtUF2xlX z8ZYw8Bj>z}uS201;LY(>=(#%*&*vBv+F6df#GyH2>HiJ22r-MSGcuV!Q8*;b$R&wf pflow-cDl4Ef+z}VDsqmT${+Mbn}6W|{iOf^002ovPDHLkV1jN%Z6E*u delta 280 zcmV+z0q6dU0M0dS#a_e4S!clfY{9h{P0sX_~kp8 zNkzawrUgEG557o2N2U*qWeW0M+4=^GGNVVM#2*_k|Br_Gxi)~WetQAv%JhIpY6{?u zCV;tA31H1qK$*}+}|dwh-@ diff --git a/htdocs/theme/md/img/high.png b/htdocs/theme/md/img/high.png index c0eaee6542fc0d716f1fd9ecaf7e30a7c96ecd36..482dc3c31dd0f83d885c384b8d5a19d35ffdb6e3 100644 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mdOTemLn;{8o>}O7EP$c);^bwU z7I8Pc5|}#GfXzdKS*3^ZQ@U_~0TaiC2~v8?6n#JcVtH8e?b)x{!RoKJ#Mxwr#&+!p zxcFP(>3L-(7Q67r4%>d*izJF!^bsP-=|RSCh6Vd#qM%qnqj ziWEzVv}}wF4`Y0^1R04y%uMTASA1S0v@#G1sUbqZx;Urzds9P3Z}OHpH(x+`j0jc5 z!NEQp+kzX70)_$pbJzB3-&l^(H;?xAe$X}7wbYnTpirxU`9ApLCy)Th{sB}* zov6aEtafy~1(+4GH3dOIYy_bS1QG;Ff(nvVh%uWXdvb4Y>hv$@nK|d1@3-^3&s()EiD+%P#u5gD zS;vv^snB#ZU4$9*D#+I@V6dfvZHegwXf-#7Bdsj$tgY==*f`kRxvgL0x4|_4g$nm^ z4)<}1@bZZ8b&d3Mi}Z7k^moVjqp)7SShPD9?SVymZt?bu3iKv?g(ijvCtw4%ZpLoi zvMHGunU0Uij7I0C;diG+?@7m>+?`dnlXRvi=UidNrLzZboZsKpP}NaaIyBHfeE;%P zPYvs7?ex&&xv4?XbeBpvspj;k1vK^h5w&<$`;nzzlo%El3`(i-(>p*h2k14RbQ)Y_ zgDN4Y{RsUEqFA=f+y-f7i$p>oD{YYu4)%`rE1Voxt#fj8abDxL)*j;Wa9jT$n#*UF zsK6jxpjQlb6F$hB5E>dA9!3leg;+?~p!m%Ji5M(IlpG$O3_%e>Ag+|?s8m8kDiLo2 zj0?^pg=NLzv*Tj36GC(1V|S(CKJ(^hCX#cqN(*vN?A?Bfyb}U1FG#yscHruFg*U%1 zY`$=$rMjfGa$j4+IVgnA`ft0MYx-I$pFg}YK)D2EGTQMAz5OS8M-5}BZ|qU^_+wK< z%-(A(>aVY72JVE zUjHI*SUK0H6fjhL8e~KzWSXQvM&^gq!g0upTEf-v1~d}3Mj_S;X^qO%^ z8CNf)>&26LInU%yHuG7ZK`k|?KN)3HkVm6hVpJ=PI+anU1|%#%&NP`-3IUZE&`1HT z0?;l3S{39P&}#vM78H$v5;~|5n7k|Bg35pGYuY{{EAJTBcS)BO4Hp~)yG82c<{Pvn<{ z#Z^4tAct%OJOyzChDs{;p^NXItDh+nwWpL_|Y;xH$d6ON8^p8dGP!+DA_GQygz^}WO# zj(>55Qf1Xyzzf7KP|>5^JHF&6e@!lpow#8^ukczj`6#oJA2Z!AopqBS1qrv#G#>A{ z*mK(lYbLKBvq6|$P5_&zo(S9GKZI{Ws?~^B&i6(WUUf5%rLM9>{Z(2Ni>ix=7|Oew z1-IZmTiu-KmJ&6x=fje`m)TCO<67WonCH5@nO#q}X5_4HD&MhztS8Rb@>Af9y5QgP zxf52##+wH#6jxw&J@8vA8Qd^-qvo52x%P_lXUsK?MFK(j)D`*HmS;_d3cicyn&{Vlv3wW$%>pz1KHA zr5a1xW&C{1cGuxd^fPwrWqQkr+wS7z?ss?UHMB>?*egrHjn%P}{Q9DwC(=IbJ-z%Y z+5hpW>3JgE`|M%OUC!qFheGZYW_HaKtj(vmHUWW7#TTX3pcyMg%#_z9EtrZDM@Yg` IqVvxE0}@!kQUCw| diff --git a/htdocs/theme/md/img/info.png b/htdocs/theme/md/img/info.png index 12e6cd655d6630345cd24c74b5e85bec38524c1a..bb6095bd00a792c96a465b2f14ddacb5bd269a72 100644 GIT binary patch literal 254 zcmV-9=YT$JMXzmt#dNS2?*=lWh#>dpH2(p4PmL*eYef zTriX}7R-Q^pppDiQ?N{peq!~}LUr9JIhqKjK&G@wj&@2dfTO$K+nWX+_9|@`g}%Ch zi?d8kSK)4JtQniwc{uy>B6m>Me(+u)|woIwP4ys zs;*RF5w)vCVL*&qR2c9w5Y#SIVXP%i1k*uL*yC0y?jL4|XVwN4`s`Qw2fruet4szv#Ko z!?y9*U`!BR%>|lc8w9~4W{(Xg!~1hx2c^AnDL#-potGt9m1H0(x}<=-tmb7cuY!W2 z6*MTTK-M@&QFTQFie{)fP<5yRr0GD@4GnOh##h7C0n!buBLWN)KnVE3qz1$WchiE% zga|`Kpot-0F@@NM#6ieJCPpSfm_re^5U~+;OiWB-VGgC3a(A%BVc2GbT7=rfvWVpn zixJx)JaibfY-%&=FpI;O?aJY0JIrRxam9E!jLWs^n@Au3qm#v4X2{L{gM=&dZ$*B` zvveXhEY>B_TPiP???gj0p4q9HW^L+dyxG+#f6umFSgKw-ayC@2@9V4{PksD$sJhhg zKDhR`w(-mF_4Q)ZdpXk5cX%=Ub+s{SY$=U)PmE6t?Yh`IG7^~VtS^6F%sjaJj@Ha< z==|#^w{P|BoPYeNeNLRMER5~gU9D6;eDY0Rzxh&q{xIAfsGaz+b>-@Sz7p+kDNSpM g1Dkpq*)x%ZNBGkg{q?jb>Emw}(#cF>A%1T9ALDq4X#fBK diff --git a/htdocs/theme/md/img/info_black.png b/htdocs/theme/md/img/info_black.png index 741dabd5e193196549a2a1296760643eb9b11c00..12a575454126e6c2a8af2bde64a37fa266b8381f 100644 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mrg^$JhEy<4J$I0^*+IbV;q~Ut zx10@Zmv9_4D+-Pl6s+!E*70?NprGtD!w28}yz3qn%wN1HcC~+tvf_-ENo}*5T6WiYv@ARF!qYGu=t2fhS3j3^ HP64nJa0`PlBg3pY5H=O_WNwC98#)D5_NBYLVG-2977~7*IqF6 zVonrbeUN|6Axd=X2B9E{3w{DREQ%Y#KS)_NKJT=2(y?i3HCxo$+pBa;ueayu`*&%M zHBV=Mf3{chpJPCNg+X42$cGmhA7dvvCwKY_PmWOfd|`rDVB6B%-DNpHg&0?vJve;g z%-5#tZL7Ta+~zH{F4`=~R~Id6^VG98d;jyCLeb}XrxsninRM;$rSmN-GtFNab^lxQ zzmsvNQGasgdDVM+IlqTpn|@`_1a|X(I#ZT!T=$LHw@3HYiK9o_f&O6dboFyt=akR{ E0M8qG+W-In diff --git a/htdocs/theme/md/img/lock.png b/htdocs/theme/md/img/lock.png index 3d99cf1eaef689386c6bcae4b7e3f237d53bf43b..317c034b9b4780f4e94966b8acf30c7ea75852ea 100644 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mrh2+KhEy=lJ!R;1#DT%#V!Os8 z+aq4m8?V_-pJ3}gYwh$6U*E}!33@v#d=Fp|49b?|=`jmFW5Dz1_uJ`~Wp9slb{$jU zP~%MvPdoqa&a1O}qHk*~Sku+2U7Oi2PIkQbLZQm!)Jq+wYe~w2)3@Yz2KZHedK6lF z$@*9B3V+!f*OvQ#58L-D_|5;z)rFOlcU*`{-+J!vUH&45w&-JnFR literal 646 zcmV;10(t$3P)e) z%S%*o7>1v7&TkwY@0X;A%0)zrqE#hD)*>uKv}hGrv?|*97qksTT2v5(DUq9&5rJZX zMlJ#oHT2j_UNUub9HzN>W;|!k?`x5X+6&+E;rU)(W@cxZw(Zc=^z@bSsj0VPlare> z;jn($+xz8wW8+N~2$Zs&zP>(01QEd$kpR%FlzNp;r`rby2RGjI_s6ZAClAJbGnmb}g^*zwdjF>?H*u%5P~Tb`@|H`^o$yY!oDN-RZU_`IF~^OrOoY52 zYr!h*S0!N&tcv{c=Z6j-Id$v0Vclpt+gX%OJ+z`RDf8E5Zs>8H5%rDB_4#|QHfMm* z9ndNcT&*||ETY&zXUZxKad0;rGVT^}-y?28NsT&Qn=%`LNgxZLw6Bpu6v_KYHh~vk zAr_6ZxbCr#fLI z>(?rYnH2M3pV>wDnS^8k@&YC1fAgcVnV>eD45TvTvp%^TxCPJ}EP@~07*qoM6N<$f*|29;{X5v diff --git a/htdocs/theme/md/img/menus/README.md b/htdocs/theme/md/img/menus/README.md deleted file mode 100644 index 12cd9da537a..00000000000 --- a/htdocs/theme/md/img/menus/README.md +++ /dev/null @@ -1,12 +0,0 @@ - -Tutorial to create a new image for menu: - -1) First find an image. -2) With Gimp, open image and check there is a alpha channel. If not add one. -3) Convert image into back and white (Menu Image - Mode - Grey levels). -4) Use the degrade tool with option: -* Erase color -* Opacity: 50 +/- -* Offset: 0 -* Shape: Linear -Il est possible aussi d'augmenter la transparence globale depuis le calque. diff --git a/htdocs/theme/md/img/menus/agenda.png b/htdocs/theme/md/img/menus/agenda.png index 0798d15f938689a6b894e2da42fd7cbe5d73aea4..35d8b1b3169f715eea352ee2bc07a4e0888b0f02 100644 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7~ThPZ!4!i_^&o3t0ZJGbJ54aq)xw zhySPl|2VMv|GyPdAGFyUr%Q+lGchk{T*4qPBo$z5?PL;Q8xb$)|>dDd7MB literal 700 zcmV;t0z>_YP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0U#q{Lk(I000KNoL_t(o!|mC@)k^_kQ=x z%rkR6tE;QZYFm`py6|22O#nZZ^6XSu;2&cq0FPk~H}itunnTQ!c-_tU4l4f$2T`qi zJ{o+@>|TA1>oqxbMe2zT#zQ z@9+S3acMK8O+Rj6JjFK>+F4XEiBEVEphjcDw_DHm;eJqjInmzYPPnc;8^l9g2=7kf zMcsR8EjRdk0jgTpY6;cqeG{S1ho|_N(kCreRQPcWWT;hZ;J+38|1i~Q<+tNp3u@IG z_;=t;=rbKl`Bn$)Q23(NjOlHqNuMKlg@v%|+SaM5av);`txuaYJCL}q;83Tg%H0|8 zYiiHnLyG@=O8@1J?uA>0ueGTB`v(5gDPyfsyuY#GKPRTUG~0#i8NW<&EbMGDHu_@2 ze`%p$+LHlaN%U(L>w9eY3jUyX1GUgxxE{_(!TCIDo7r`ixWcMBmsqG~8;qL;EVUZ6 z-4nBm*t?F+#Z)*Ai)!uGHq&iF{>G0gi*aA0000Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0Uj0XJcGUf00EszL_t(o!|j;SZG$inhJUKQHye}TLe;1Qe& z>THk^$OPAyi)0~)ZLr-~^+~({#vk@?-+wNM2&u*$5{?X?;co!Gp14<~0^b2p3|s>^ z0cb+O-v{{S7Qj!|e8iFO0F*Q9pfj{p00sckrNhEwhV}8GGykkgQ8o_%+LSe4r3^o0 z_&M@(MuDY5oPk@fP7rHe8Z@`^8xGnunL1F~5V*6Orq+ zA)-$*ha#d%YuA%qNL!XA;Oa_;a^hL5wHH3&U1cM=QgVqe&1|)7d!uWn8Z zGhzZN$4P zS{E)O?|Nb;E#xt!_1f3=xW*DUj{ZCt_!9Vmr~lnz4IKF0AmB@6Gv2Ek9@%mvEfEsh f2Yfy~__y%C#jBVt_@Tw}00000NkvXXu0mjfo}S{j diff --git a/htdocs/theme/md/img/menus/bank.png b/htdocs/theme/md/img/menus/bank.png index fbaee7cc6bd21fb4f562365a376918f52633026f..b83e7cd310aa66c2d1fff8988bbb7dabea41b332 100644 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iR8JSj5R22v2@7QYJpUK}_5Z#9 zr~bzr(MbC}|MUN&^&Ay^DVrY#pZQ|{@BiQbD<0hYzvI8pjj8Pa_WzQ%-to&`Aa>*D z|C9fJY@Ymo?nF}oR*j1e@(nqPx#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0UjF*gs!;&00O&7L_t(o!|juHgdX)@yEDi7t@D1>FBoln*mjVY;#P?LKYVapg1n-0aZv&+i z!HQiyFylX)-s1DpZw8Do2-uc^%gjst6xj(I=n1)lq)x&qJ%TnDCx%{G~U z%zL$8z(rsYa2m)O_kU3E76M0f?cF8a2}X#*zE^ysHErzdW;gIquQ7c%lt!^{YNd*>0{XDL`IKc z|0Yi6{TA#eSAV^LSGp$$yfylRz*k^#8maQAtAEGGey;Qd*LW$7KdINikAOe`{z~66 z#@d0IX)ymzrEysn0NXt5yQS|MW1FjGJ`*tJE49@w`=6>j$Fdy&o&b{#`}sh#hkrXP z^Onc_N~Ojj=|jpU_f^ZZ$?mhthP)B;LkbxyuFZ&FwrN%dxve9TtU{v*JT?|+(bxm; zlI;UvjgNmj&X@;S1{@Ugmw-NFZmaZF>G$%v1K1b9cOr$^6y^NB0I$8M3bZAOlGqAZ zRjvSbi`{P;GatMa*Z{0j--;XjcuHbafNfVed^Z+sURy`T=`Zn}l(}UrOG}l0B0F?S zLn1qLN<&8eTjra5K4nfM{=-y!3c0~*!Pm4jzDcDe{{W+U8l>_!?qmP}002ovPDHLk FV1m@oVeJ3_ diff --git a/htdocs/theme/md/img/menus/bank_over.png b/htdocs/theme/md/img/menus/bank_over.png deleted file mode 100644 index d395710a8777d9c9612301f716557ccffc9188f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 620 zcmV-y0+aoTP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0UjR=>1v<=00HbtL_t(o!|ho?PJ>VoeKqdO4XP)Q6WAUB6J46(0n~Z|>&|7HxN&3Z z0Zi}&(i4d8P4EV7To_l+&5-;|3bch5(EpNIOc~%o9`ok^wn(C>*g=C~$y@T4e1ou? zb9@hgUm?FxVr}x*6~Ex{U&=;f3Lr4#)NTs-DS)1lPXN3&rQ3{D9?1jQR=H{NLjaDE z_W*R8qWJ@nN+1u>Z(6tM0J!|iYVtCl6W+@^b(;@ir_*i^^uA@(%zPDYb_HPL+&;DmAZX?Yo?M zPvtXdrCTv6jh6*Iewmk5%1&2N@{iK~5-hu9yiwTGH%sD?$29$=VPJ>y3zUbM@*uYA59NKm0^BP@=xx8W57==3}->Y=; z3EFCLzLCu-yTxtEuYp$1Uzv{a(N%$14Sp+;x3aP17vLAzGvAk&!lohs0000MI~Oi!Y|DHp>iAVZ!1Rak2|@jTzxi(6 a;b&OLqgP$G=;8^Wi42~uelF{r5}E+cXe}rJ literal 1321 zcmV+^1=jkBP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2j2k> z3ppAMu)+8M00gN?L_t(o!|j<%i(FL{g}-&G@=i=b5PSqdM2t?Hh(!DY4n#z7>crpR zpK&hEon+uZP!z#|5-<=9Y79mt4(ZhNYpq360gl^#A9zR7Mc`xGUrFjD)kh9|t@Vhcw}AJ67eL+N@0YTE(0y%e7{%1l;8o9UvImt@ot$u#x@o z{xa|ea1xkG`nA^j1#qU6a%Gj^`}Epwhe-OX*7_0fI&cU$XxoyWm-HI&o9%CbQYjIzvdq~ogz>AU&KQQ`1~eDEaHzQ&TPpY_(xi_jQrlL} zP@+#4_bwx~WjSuMg#8-*m5)FX{iZO28b4u!Q{1%KgZHK6vEQ&Fcd6Y8>CFuqoo1 z^OGoOU3R8{BQ3S7tYh|-=@64tA9Tppm)n~Tn8hag_?=QO#3GqqxG`%*YM#$GiX|F& zq@eZTKE0&2wlv`JUYF_f^8~Bl`tDfQCz`ZbH+P?tq>mb6&u-H%#chVZJsdy=4VOk5 zvmw2D+qWBSA_E$6xaC-74A!HxNuM|nU*(1;*d`)vhOM!_MNuQ*rzuKX3eOZlJ%_nBtoH8_hbR%_u)Tm+m67YniT|v!%B%K3( z0j^29wW=c3TxmU`UbDaxaK-m~ZGSH5Ebx@1KY**YZxkWrzVSlKQ3wi@aQA_Tgicn z?MZ5`ZU8qP+WEZg-N4c2+2Qx?5NQ*afyW}y5Cl)XPx#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0UjeGh88CP00PZPL_t(o!|j>RYg0iG$3H3lwoO%1!D^@?{x;PLS}Z930Hb)3BJ`#n z1dpPiAove>62z0B7r~PU4n9_&F+VyX3JY+8-P1Z#izBhmHH2`rC&`x5)|HUS5Q zyxp07`+f7~&CX0>N-3I^T4-WwYVh;wbl)?;0bnig6?iTDAkAdvcpb#d3=Q^4~o9&QkLq0M~* zlE5RE(WVXf=C&W@S{Lc9zv)4z(wE!aMmCPC;>-++pfTm z0egX7V5`hMmHCIj77eJ0T3sJfr+_uUi1_j$pdaY8fUeL+*Wlj*=YZn|w+NzP*Wlk- zKH4D4x(5Fdcm?#-xNfS7FdIo$c}v`+7QP2ex;|kmbQHK;rS22pS|g>zkAcPV@!Du; zuE6V+&vzN3%rvl68z*Hv-AI+xN?^aoudf4FfC+7G0Wi>LW#CB<@EgE0;5~5FBTEAv zjRL*{=<@*Fq{-8UXw%;)KHq0JsCp$`_#)RP`CVYfrRA3Z2Yq7s6p**X`opf>rd!^k zANZ^V{BGB7v(J)*Wr2c4-X_)9kPFLq0txYF6OVh6Hxuu2W%(Y9Reu2AwW1~IqqhNA zB>ItBJ_VG0cudnPSoF%k=BO>-B?j=z<;S(_PXRf9Qd)wMfnOg`Efuxv4*|OCqPG01 z06?ETUCp_bvq|CM+P$b}2R8hB18s5Zei~jPc+(rdhJ!hE9 z2dw$sDBw+D_-DYHKT*Z`B9O7Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0Uju{RL`#f00I6JOUe(4N5oY2F(Z=AtTTY=md2) zpc~K$)IZ9d&llT#2pe?gABk=Bc#-5MrywF6)gEwQJ2d#mjh@>Ar~#A!MgWFKC+dZW zB!?!Vf&4ZQQ6uF~5_n6~?YbxMn&#VOt=~eZR2l%)f_=prrxM^bfbYnfF91D{n~j{% zUCwHw0&_oHc?JLt4{hzM06g=2mTFTH(HKa|vuFNh?@N74FhB6mUt6qp{QZ<%P`OXo zcMgfs3X!QvtaG2R2EYe^*M)ntGH+IfT~_b|m&3XCx29A|s><_%Jr~ZCT?n(J`bHW& zxNgU+m+-YkGon4Q?XFR49Z7>P@080oKEUi3I4#VPO=JG*ghv~Z&E;Og<{s;{a|%mT zs7;tZ2bzvh606+ID-W}<^iD_@Wlh+Ilh6m=L~a_gtICk>2{He~FP{axj!0i)wSuDT zOMq`9!fTwMJYSX^T3drRGo){m8hjl{R2RIN@T{cZV{F-M_j_c1PKWgySbLh=&#nQl zCN$W?%yzL%1%3)kbHVGBVH3OJlWf$Jf>$1?unX`8z-M5-0&sO+<|2B9A|Qop?ny(9 zwjv_qnICygnd^T3mTWDT&+3j$I60qtzO(6;hEuW8|FFtxvb7_Phc&lkDZnSOL;nx^ Y4;OV diff --git a/htdocs/theme/md/img/menus/company.png b/htdocs/theme/md/img/menus/company.png index 828bf8f2e709d32ecb911377c85b8538f558671d..7b9227c0674c839b3383586590a7bfe6e6b13fdc 100644 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*115X#n5R22v2@-Q2*o!&T^4`dJ zm8HNIu&i;yWR2?$r#T~d6}=CykU#O2`Rk=i511Ha@9Yb>|A$u;sF%Uh)z4*}Q$iB} Dt63pP literal 572 zcmV-C0>k}@P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0Uj=0H)@&y00F#7L_t(o!|j>BOT;h~$3Lfnhae(|aEm`c4ip6i5eIQO1pg2J13~`? zXIEFjKf*x-CkI7G!9&pDI8eu?ca2MiBQ&|T*K1SEgDiP3FW-Ke=A~^-N=a31f(n}# z@5OuZUVJe&Rlpo8s-?BIYDTLSP^8+xa)xog>Y{(j6fZ^?dj#B-xoiaR0-Rf7E`Y6= z{;2FVFMuv^Z;9y|?vN~7d-mN9$1kl`D4}6+8c1GiLV3OmNE6b$)9E(GJfyr*aB+)Kdcv@-u?jKF}KY$N0!k50000< KMNUMnLSTY?!u9k3 diff --git a/htdocs/theme/md/img/menus/company_over.png b/htdocs/theme/md/img/menus/company_over.png deleted file mode 100644 index bed6b8dcbfbb062a2ff1d6affd40c1b072b2c2dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^`arDB!3HE>Y`eG%NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxddW?hRKk6QcL#T#LS5yxbDj z0E;X!#V4_weWx!>|NKnv|EtGu&89A{;LNF4DP%sUyZntkb7zOHi%VZ$jbfQduietc z{A%~FJy*Vxd(2Aijf~#I#{$hg?2+xMNk)$wv*J!3-_vs=?yfV>6YmEWY@b$Ds;+;c v?zE5V%};~X54cO)?NVPzt=JU!Nz8^(ebcG0kG<|@f3NZ5R21yFQ4Xh2oPv}xcPE} zyLgeP(jsN9Ngb;;ENs3nq&Rcu#^P(wqkYocetBj@?pU_@z}`Gzo5;*Z3_2SbxOtYO z^wdr8651)BGRfs3yRs$gWO*0fy%z;NJXXB8nHz9VOxou|9k+a1MC{+6EN4&ewR?4? czVbP9;5C`GOW&qC10BKO>FVdQ&MBb@00VGCaR2}S literal 912 zcmV;B18@9^P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0UkBiQloYN00R(7L_t(o!|j>LYZOrs#($9<6g3e=M59Su5y68*TtXlbQLl=K3ldyF z4ITtR@aTWw0(w&P5 z&DY&ue_gNY^-O`8k*hX_9JW09Jo!BN%v(8d4rudzq?wJD*O=Ko``60-oFmi9PXcyG z<-0(&=lhy$Oq+7xh)ACW$`at#XH(i#o7ovNi#mSW%xXQcn0Na*e?gkI2ixUUPOKg{ z2{dZnpWxU^2a_@7i_NUg%o@$CN8WB`hs~@s4!+0Zjb^sZgQ+sJdY$9HYlcC3mYJO} zvlcV!k~f&y7Tr(`S1DYj=3cBT!XCwAm_zZdT^JxWRsy?$wNC6la1?mx#5M`HNb?K8 zOrRS$Ej)@H1l9o)6^m#bibo(7@*9BzK#As2;1X~g=uoT(*eR@w0~iK+b@RQz8ex|^ z*NA$qIUJOHEwJCCN|WM!ij@fCmb{2}naMZk*cl0Mt_4@|IrJCIi#-6y7?`DpNWCJ=JP+71-+RU0NKn z>CXB0z-8b|s^p&lOMp4RY@iir2d1Y{`47NNjR`H;CUpbYrHTX4tZEdt@;`w)>L(*w zvgAK1UCNxtSrMZ05#YKiS<>cbdvFEVC-vJzIH>XwmEWhSlv_XKe*rJGXg_HY1yTMH z@H|M5@Vha404#HMnMEm(f2ShQ7j%L6CEo{h>GNlG-DJsk>IJ mo@TZ3C>gYZ{GZ69WPbsyx*6lY>ctfR0000Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0UkNtxZG$in#b2s?4;$2(pmc)J4YEP$28=*9$Oa`7G#i9& zKsO*8xD#BzoF#fP34e@-hU_n1%SHuKZ$6r zD4C>E$G6uv`%*Ze?{@MS0q_6Xq0pI^9)n*+Wcy4&PJ z_demj0lYSLyWa3cL+3_1KOUgpc)V)tLn`;A`zwGC9_RiTJuI>D+{S~O;sZ23w50@e zTEi;g$6dgiYAPC1&Gj{AC%&cHf$k5D^BnENnB_bmMm%j#0JdYGhr-tl=yJdgvTb;# z@iFqqql@NkCkjrk^@w@bcQSYdkO4S9>iK+iW3N_If&;+H(W^{i2YM8CV$xVU>gT}V h8XjY{yhNTU{s4BK^m~$Nny>%>002ovPDHLkV1nqy7Iy#u diff --git a/htdocs/theme/md/img/menus/externalsite.png b/htdocs/theme/md/img/menus/externalsite.png index 01e30553fc569e01123faefa7ef3c019cbb36b5d..8abd6437ea69f4fd9c43960b6a14d677e94764bd 100644 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1XHOT$5R22v2@+}#>L2`{{-3ik z{QqA;DGqJ+#_1fqE=*S02LxsQZ(Jq0M2e%bY`eG%NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxddW?kymxs9pc?p3FMN--{Y$aT(A&9uv>Kw{59X(ZGyAAIoZy6yR=qdsl%PB8wk zFeP(F5j-(yt?6IQgi%v`O*!-B5m_b(trNyYCrLB*7N-NHB3B3e#hF+ zf8rJ4pZJ&k|GOu<9V{=TDW}&3&iwhZVrZR561CN*1OzzA5xdfz;$Z(DcuC;w6&}z4dDsW5y4+fo*fMq{L5xBeb%ZM zx(}Fke0$|}VBVegm3vRe?dM;a`C|cV^~J0YZ21V3e4M`{qNQ%tnJccK==5~;b6Mw< G&;$T2cj_tt diff --git a/htdocs/theme/md/img/menus/externalsite_over.png b/htdocs/theme/md/img/menus/externalsite_over.png deleted file mode 100644 index 8e227ddc83f7c92994716cbe7c75cfdb4814feea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^`arDB!3HE>Y`eG%NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxddW?{il#0xY<#M8wwB;xSf z8G*Tn4FuZOUuIx&QebgX6gi|I0ws?fNDkmg`|$Ru(%m)Qua@es{_=m)(;qeE|B~F( zHQ5iuh30=dB(&!NtA52n?zj(4;(H#@_h zQ}Yc&jE$L-x@R?dCtIu8J^MTDzUs$~=l;y>XZ-aHWX6BtA0H1^_y)VLo3|s;IB)T} z?-?sUZzU=*VPjdU6YcJ2GTL*@hZDU$|yw~oWpW0>3HIb8k zZkqI7sxrEQ`JCbpHlK%D=ihkGz7r?=>&>^|iq4&k<_QdTjk}-k-=+IZd*46(Yt40A hxFF63``};ZUxs3rV>T01q(edB>FMg{vd$@?2>`CysPX^+ diff --git a/htdocs/theme/md/img/menus/ftp.png b/htdocs/theme/md/img/menus/ftp.png index d9d96f0255b04e220db0fb0549d01c42bb2df960..a70a9d29b775c0cd504a87277e11d5de4ba276d3 100644 GIT binary patch literal 92 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1WltB!5R22v2@+}#>?bm~G8;;1 pUUrx?+08lAWJ;T##zheZ2J30ZJWg3Xi~%ZV@O1TaS?83{1OS+{7vul{ literal 788 zcmV+v1MB>WP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0Urkjp2N2Q00NXrL_t(o!|j;AYZO5g$3GD@D2h!KF`&^Xhz4U}W8(#ag(&DBAXWjp zC@4`uLWqSDEyP05*x4xlC~PbQwG(XAXkwuxK{!Q21mUi@+}=%^R}7E2-MP)~c?&!6 zSY~eCo6miB_RZVvFvgJ8wu%h596pE7;WN}$tNuaYwuj$G;CvJ7^Z*0EDPT<2>9Kwv zi$!mYv8`Z?2|Vnz@(VK^vmpNV7;#K1Z-6C_|6KLd<^b?m#Wdo-l=QZ#1C<2fF9Dq@ zW?lS!*4Zuw@Ix#VK1t>Gs(9ys&kp5(1Gj*i((eQA0Q*(EN#JTDc$2X5o2_^=z$43F zuM^1iFz^7_=$LZ`*a{4};NMxdDT!t;-V1yKPB(zB$@Mz0Hble%a1?lzcAl>|%--|1 z1wc2@WsNNYQ@Pr$Vm)IQT5bLYj7 zyKKk*1w8YuZ8Ur}<=Tgc__byVvncol;JF9HVodll@Wtx?37gyz^4;bbuty4{OuR`& zDZdRk=@GXGy!fB+f#c!ql=>r1S-S diff --git a/htdocs/theme/md/img/menus/ftp_over.png b/htdocs/theme/md/img/menus/ftp_over.png deleted file mode 100644 index e3ea742e7c7edd0d0e970ae45c28e464d90fce7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563 zcmV-30?hr1P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0Uru@FTV-^00FZ}L_t(o!|j;iae_b)g+DX?j~z%VkPf_55KAx>Bv{*QfxRp|WRJ4x3mqg9R!j-VeMK!n`UL+Y!MHE(||E*eNr=C9oS&im5HFBB& z%Zi3r_>{^?MFpusQBhTLi{J*Bt9&>ms+Q4D&0<@Vk5%~UkU0`_EgqeDMDSF#oU&Pp zH&$1cP$7%kc@Q^EJM2_te_On2ovLvxW@?((!IDz0w;JOM!|y`caEF>(4N8+w{>6UY zg#+;2@HyXH$eO-qbmrV9kuaJ^@%*j+v^pU_QO%{-Kj3rO3HI_#@S%@BGHVYXJb%xG zP5TsuaNKt~5;q+UmdnXs1e(j>>FVdQ&MBb@07N}3VE_OC literal 570 zcmeAS@N?(olHy`uVBq!ia0vp^`arDB!3HE>Y`eG%NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxddW?`XeJfkzEgKWroxlsyxRP*3bOO7PRLHVh5B4-HKdZBWO-EYDbZd43|BdSh)=a+78s?*nvSYh+ zU}C;r_LJ=m#t*JspB8eYAv1UOst3<6w%?Jr``y57dsb_9$Bcwvmpqr0XqTk6}LjodY}Ekti%cR>yn?%_pxT%nIX%f*6>cC^FE{avej=wKQ5T|;QOML@*NQhbFNQ4 z%Ovl}R%N=6&8<;SS2<+gW__moeV>+2J8AoU%F7emC4b5vbQIsgZ7L84igiy{KbLh* G2~7Z_uj}Ff diff --git a/htdocs/theme/md/img/menus/generic1_over.png b/htdocs/theme/md/img/menus/generic1_over.png deleted file mode 100644 index adfa8c1599b9c2b74e15d0b86e5cba6dfbe8587a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 486 zcmeAS@N?(olHy`uVBq!ia0vp^`arDB!3HE>Y`eG%NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxddW?if!v#l>^8Umr0u{387!;VsMgq7~=$b(UP6Ti&X<-Ic9C+F;Y{zHhH(ZWm89 z3enS95<2PAi4Rh%W-jU7DjcHrP2JRVZR673pv%RM+l|9#&F@dre(}3~uc2+(y|q>o zSN=@hJ%Ks=`L^vZfBl~OUQ71gLp0RRbAQf+%&Ag!oIW1&b8c-9S29YA>}TFO(=_0c za_q<6wLg6p+6d2FexA>UH^(@QHU6@+edKJh%=KRtd(-Qty!`N==O6Q5>Ds50%W@q- OG34p$=d#Wzp$PyNUC@aD diff --git a/htdocs/theme/md/img/menus/generic2.png b/htdocs/theme/md/img/menus/generic2.png index f4dfc5f360a87341fd9e6a59f10bc733c68028ee..b51ce3ed95a437af48d672cb4b8494807587c080 100644 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1A5Ry@5R21q&u~5;q+UmdnXs1e(j>>FVdQ&MBb@07N}3VE_OC literal 570 zcmeAS@N?(olHy`uVBq!ia0vp^`arDB!3HE>Y`eG%NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxddW?&`c`6eW&h%Oob=M$&=N7_nyQF`MYFDKH7{u|d1teJeDHOzV1N9zqM z4n`>NXMA%dQ{Ijt+067mm&j|Ef2Y5-*|JPJP<7%+vEws?slG9?#~Vd9FdWgDWXE>t zz{GsL>?hkBj2~RNJ}u-(LuT&mRS%wDY`-IK_q&1F_N>WTt$*DX8t25R&EpBcJeij|| z+0P6F^*;N7S&0+s*Cjuj?_K+O=Y2-;WvkzWeq1o^!S_WgPx#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0UbDk&Ws2E00E>)L_t(o!|j>dO~Wu0hQ9z(ctC0e0}#XjWCOYZY*5&s8_*398)SsC zLD?YPpnV2J5lH2JcsZ3Kgo>RwH|irDwY3`iv;F(G>jol1TVsP3hlj5#wo0nE3&i?< zs@W*`o@S&O1093sCcqpRYp2G!J0~JG*%OgOMCRf)QV|)5NY{oZu&~Mm=$9?%k4V-H`#&hw(Pdav@NjFJB>LX}>qKPkgMI`gT3 mU;4Tz(s~5;q+UmdnXs1e(j>>FVdQ&MBb@07N}3VE_OC literal 570 zcmV-A0>%A_P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0UsIsk^a;G00Fv5L_t(o!|jQgSZP0byDzW z=znlk2M2#a9qg*8pt#sU1S<#%R*Q?Z9tY2GDPnWm+qP#`_J%zKlE8Y%#B)LBFqKVQ9mjzb zumHp?l0F8~z>#k*Yvi|pGvL(MmQ=)mX>FUT;OEhY+#f#sfCD|vDw~LyU{geHL}Xh; zVuoXaVnsyKI*-v9Q_X+thFwx*ffL{yxCIJTNM%GZ3CsgM+FrE1VM}FBhZHGa+ohHT z4bE@9z_8W_6y+B9Gz*&f|7_G(pQ+H-%CQ?H^PjEyS6Qm#N2(#RY3j^7**Mv>Q|4P* z^G-HSHcmD!^G@?lHcmESkbkaY=ATSE2DxY*1SWv)5Q*Ob7pAN1Rq>#f;P;}bABb2W zoY$4j0v|yJdNsZVMu9FZBUHY#F9L7A@}-u^J@=I9$hR5!AHhKvxC=E9UH||907*qo IM6N<$f;5xuNdN!< diff --git a/htdocs/theme/md/img/menus/generic3_over.png b/htdocs/theme/md/img/menus/generic3_over.png deleted file mode 100644 index 0672d20bce4bb1776f71dc8038e32a8382f5ae87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 486 zcmeAS@N?(olHy`uVBq!ia0vp^`arDB!3HE>Y`eG%NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxddW?5iL3@)IZ1~;#a?Jzp;5@B{K!=^C8I!mt3EpOG_?#fmmZLn!}-?!H?w~Hql zh3M%l37z!m#0RNWGne#k6%JARrfzDwwsC21(B)#s?Z)A==JzLQzxdt0*U+}?-dd}P zD}Sc$p1>UbeB1VyzkbhsuO)l$AsTAuxj$z@=2WRVP9Kl?Ik&clD;cFl_A_stX&P`z zIrd}k+MhlPZG>koKhI~wn`4~D8h=^ZK618L=K8OSz3FvRUViw`^N;zjbnVm0Wx0-^ O81i)Wb6Mw<&;$S`U(e_O diff --git a/htdocs/theme/md/img/menus/generic4.png b/htdocs/theme/md/img/menus/generic4.png index 5f9240240da3f037ca1918367f6b6489b972c260..b51ce3ed95a437af48d672cb4b8494807587c080 100644 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1A5Ry@5R21q&u~5;q+UmdnXs1e(j>>FVdQ&MBb@07N}3VE_OC literal 570 zcmeAS@N?(olHy`uVBq!ia0vp^`arDB!3HE>Y`eG%NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxddW?&`c`6eW&h%Oob=M$&=N7_nyQF`MYFDKH7{u|d1teJeDHOzV1N9zqM z4n`>NXMA%dQ{Ijt+067mm&j|Ef2Y5-*|JPJP<7%+vEws?slG9?#~Vd9FdWgDWXE>t zz{GsL>?hkBj2~RNJ}u-(LuT&mRS%wDY`-IK_q&1F_N>WTt$*DX8t25R&EpBcJeij|| z+0P6F^*;N7S&0+s*Cjuj?_K+O=Y2-;WvkzWeq1o^!S_WgY`eG%NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxddW?5iL3@)IZ1~;#a?Jzp;5@B{K!=^C8I!mt3EpOG_?#fmmZLn!}-?!H?w~Hql zh3M%l37z!m#0RNWGne#k6%JARrfzDwwsC21(B)#s?Z)A==JzLQzxdt0*U+}?-dd}P zD}Sc$p1>UbeB1VyzkbhsuO)l$AsTAuxj$z@=2WRVP9Kl?Ik&clD;cFl_A_stX&P`z zIrd}k+MhlPZG>koKhI~wn`4~D8h=^ZK618L=K8OSz3FvRUViw`^N;zjbnVm0Wx0-^ O81i)Wb6Mw<&;$Tu*w1GG diff --git a/htdocs/theme/md/img/menus/globe.png b/htdocs/theme/md/img/menus/globe.png index 8c2380eda131f90b77a1f3792b2afbbcabb5b7b4..0bc7dfd48026b9d341ad11217046b949625fd402 100644 GIT binary patch literal 390 zcmV;10eSw3P)%JKo*|uh=kp7(37Xv?ZQ=6X-W;_M& z)p%NgsFoSh{@;ZYGN24v_i6q7|EJizltqevu5bX}`O~49nM=Q`w1Izn> zvJEO6`|FcVVl#s``eZeOE85u;qn$wpr5#+K{BWnEox{h;Ln}oF$tC=Xi}&#&&R$_z za$bXr-Q{~6tc1+yDRo literal 1175 zcmV;I1Zew-P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0Us!>PyX%z00b9FL_t(o!|j;yYnD|M$3LsKGI3kILmJ!LG-)f%wxU*A)T$p6L@+Rl zAQJ?CRj@yxs2}_#5Q>b*h>FOc5<<$Xbg-bdtmz!)RyGo9&D7~MeBXhmU%n3>@1Ez` zv-hRx;5~4;&pr2^bH2~_J@?-8yj5n#T$SsX!%_iX0bc>1EcL(^V8j1_Bl5j=MpkB) zrFEIvh+UR(Gux8Ub~?X{>G-N3KFxY}-@9~c1+B=}jR)*+u= zKpoHxJO+FSv;&XJUq?C2*Q+5WJ`h72)UpU-ayscZvlcVkZf36paT7770q--jVKZAF z%(X~g$j~seeHqq;aq7+NJ;=A3U#ctxo&}x;nw;;In%m{pey^8H1iuY< z#*HWR#&-c9rGWSa=oLdhIDM}`H92ycfKK4#4xI@F+=i|VK0WOspyj<|b1n|YAqjFA(Xa3z_?hW7=@UnJ(DYB^y z`_I+dfUQp754;_M|IJ+{K5Yhd?ay}FOsH=R?0=7Aegwz`yLuS-<0|F+A$RI{`=L1S zhk<2od?&C^zsNXn(=37?1SkIIx*pvu_~ zByCvqxwp!VSE$PDPS|uORi=)qC@bjM%U<9{pcYuD)|>+Tq_P0uq2O2RP6I!v`k_JN zC3^lx)ndCg%yIQu7#$1zM{)Rzo%TFm7NMjy3->;O33~Lmy2+Y?NomUD>C%Kq)XMn%; ztDMlO7L_COfu|hflltf(3wV?kmjw1t=kx+lt&5{NW7-sB*4?a>S*&WdPq~g_^eRQ8 zJiideuG$1m-z*&bdC4V>*5tWD_TYBCA&UKLq?Ma;o)Aso-mY`&{r* zy#V@1IF%M4##e)gr~`hMeOqvv^(juO%%m`DQ}EI7E51y5(0wUQ>X*pm|5~Xk^V$c; p^#aT#@Rk4PE8r{OE8wqT`470EiOhy-AhiGh002ovPDHLkV1kzDC9MDe diff --git a/htdocs/theme/md/img/menus/globe_over.png b/htdocs/theme/md/img/menus/globe_over.png deleted file mode 100644 index fd1e54f4754189e57bbdb7ff41d7c8e7f2618ff4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 844 zcmV-S1GD^zP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0Us+gMz2%=00PWOL_t(o!|hnnaoaEqea`jY+92u#(FBdUfj6kSfksd#s5hwE3DgOq zPEh*4cU3o#CqRE5TNp=DvSY_dPPoIJMVjCv2tasRi3nb*+~5Vv0)7F%fR9TCpaxJ~ z0Ef4|Ick-N%+XRr2Kg_eh}1LJPT9?A&r8p-$@On$oUa7%V8%KCzW|KX4uAtN0O%uj za%w@FC4e=69{}C~_y*t(z&-61kMVp)1wGNyLlt$7fS#NZCnC2ZvK5iW>>I_H0`3?p zm6^*;2%Q7G-6x~7B(VP^_|_Qj0{the zo^JtsP|tf+As!NWzvIn}rrPx8HvI3BHrEk*p8zymf3L>hAJ{iZVx{3+C#T8Wgbn2b zro6Ag*8w9LLrI<(yfCB?sBHhr=Z#4?E#Dai<&|2Ojd~#>gfj)cS5@O0QWzX|`~bX7 z9(QH%nJTZ7;Ge6Ev5D1dA>d-PR52$f>SNY7Di`&57XrVF9I(G~xD=6GJOJ+^CCOb0 zd^b@A55RYkI@_~NcuLu^3Cj%leG2>^^?b)ZWDFea(y~iX7qE-5k#ct|6>?t5%9`Tz|0VqdSndG>0$M^e#)x?8 zS}S8bSL|mzV@o`!P|0000qqcunPTyYr(x@U;b%s5uWY!=cm`M0B(zG zv+Bf|bwmDmTuT3BRW1i=TraHu(W2H*3H6p_GT=cW9gYn7;(mCJ=ms$8ZhkW@QrK4G zW_TO3QCPoiRjnhLO!^SMypjxhF5>uUNH+VT#kSLigfDXGC>F4adiQNX@ljJa!D6^p z71MKY1|n{nkkU1KS}b54bceh5_EI|2MM6^hiG};94xt&(OcxFD2e9E)#@lCRiiCLV z0FVri6@}Ck-i+r(LR>eH(sM&*F_Qn`K}ydL8TawpW#t0TW^DflOg)_d0000P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0U7}1jiONi00X{BL_t(o!|j+$ZyZGwg}*xw;#Y72!E$(t@DPs(P%Hyd#0nPd$Oa@N z7D$LCEB*sN0g3+rDG>Vy6cTmrrW&I8{@#Kus3 zP13lek0o8w!R04OpGtZ|($p}(zbNT^4v@r}Ez8y?lDe6?i;~`zbYxH*m3`u0^K$=| z;pst-JpKwt)^Xm1C@|0Xzsy zmkK^2I>4$GNj0;~72s*$xQ&?xUI%^z{si8#u|2J4NaHflDtqShjJX9Y01Gzes15oM z_yJf1E&{VQt_E!R{e<;*pn1>if|AZjn(I@4zc;tu_p!1Ac2MABK-*d*iDLpulY5!@ zN{PV3Zqw?4E0E@Y&2=2uiHMz{`ur|Ccw#Mzmjt-EpU!Io%;0#cU6P_U0bQUI5k$(kZRM!ez@^QPx=G_864}1hXYu`;AfOTL6_zL)}pzr6L ze65!Oevp9u9{AOq-0`ee{G0*i`uO_{(C*__rO*5Y;41KPPFfp4RZ`U}GVK`HO1YQH zVuM}5M?@m&GO+9|Kh4kKKHhQJtXFE$dCW3!=dOXb{OlE&&j80qybs*hB+!&}0eA}d zrL17x3-}v8x@{J@j^7*3D9@Uu7J)HIofNeuUeN=)(?G{SN%O!t;K`h=Ju-QD%WPEh znYHV(HQ+Dc4^Kn`xDgTEQou`k#>;;icmg<*nf1K)qBCn^&cE&FE$fDjS&oR+1A#Yl zoHVbW@>RxEpA(WYbw%Ig7~A#UvF=-iHM?j7xE>MBfxtVFn)3CGzO_9Z_W2NC0`XBf+ zz@xT&t3-hP%2w@06W-0Y9TN?^R=bEQubLftXUptuSJlrljcNO=yOLtFPD)h-e#J~M zkvjEPQaMoXyW;v<%E;b#HDzQa^mN>&)+5V$nkd~Esj$|Yw8Og!rUk|JSbi{;{RR91007*qoM6N<$ Ef)z6M7XSbN diff --git a/htdocs/theme/md/img/menus/home.png b/htdocs/theme/md/img/menus/home.png index 2c174340c7696473d43c94ba34399b19fbd6fbac..1614347a829d55ba7c165290563c4979eff8693a 100644 GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1RZkbk5R22v2@-1_*h?KyHCx5F rTxH`ys{UftDnm{r-UW|E=?OF literal 679 zcmV;Y0$BZtP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0Us_zEL+C^P<)SlA#NHW(?Tq}f1A!op@03ws+IrLZDduriUbQWEKT^Sd^`sn=`X{Qk`E{@(9tPThL<_s+TZ z`%dScbMEgAg%Av?tT4c`3|~;TVXTUURu5Q>cP z5JIxRSj=WJgfQE~E=j*vW)$^&g1qAl>sq`g| z#mMvXVH0!g!?jp3->#vMox%$|sVZ#t;|g}vREdA$G~O=-el4bOvJb7qR~%1&NMZO1 zT)>(>_Fu2kY?d2-Gp=H9LmJ4(xSj|82+m@(VIA-}yw1utQ&_cxViQY}JgM?Cwl@g+ z1D@kenQXHw?OE!Shj>s$kqUhXp}DFmY|;n#q$>Ds&ws+N9ClkVl74=dp*z}fX{prn z-S9JumFy0=+|f$h$k5%1OLcfYZ!^>`5N_RjM2q<(0(_}G{(H}tg`Zmje5IammxON@ zfNw8{O~zq5j6XT-Ha79VZYWSG8*yM;;!5`(1J&Ckb!D4ap06d_#DcG-NYw#fndiR` zvgcd)f=x9Z*l&4^^1kjHPA?0?CE>FA|B;T%$nW&RQyF|CWuX6u{Ri8ndcY`eG%NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxddW?bhi@pN$vi8%ar z=KH`F1A(LWEo-Lp?crO{?9F+-u|z?2j;IHFP?Kzj=nB~*d@mCIKDc+bck*Q37Vk%I zW+(nIW~pmA`%E{dgJb6_Hc9V?wp&>P+IIvztgPc*P%LBKw2ikx%;D(o_?ny>u&iC-!-Gk(L|Q0q~l{C1+lD|Pk_ z2}T;7D;8U9s;O6(X4(AMqtNunq5PeJTCbLV(EPH^`;q+uMP(xP`NGM6SU$Yi za*jLa!z?QgosH8PH-?<)IT-ljbwBfe--P8rmD>;PDz^CiHMq6y;Uic3T8%x2wEx(j z{5;ovo=88|*-aaTl2wm+-Em41es}cd;%eC+M=memziH|9&(d~AKfC@qRsOEEVv7Y7TNW+9 z#2|C_->bVE_Kp&BLiewp$E(zQGR~sn@}oz7J4{m#yh=%bp29j`ZhyLem=S{>-=TX? zO!Ln$tlI3zVICK!fw6eq|(tSna!Se&Odo%^yrUf!}vj?wq9vbR~nQ LtDnm{r-UW|UmsL% literal 718 zcmV;<0x|uGP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0UtEEPNJaz00K@)L_t(o!|mA5i_K9O$MM%N*`SmSjSwXpjr>@kZ2Z`bmE=dHNt03% z3pO?=Wurv-ogYc5`2%E#g;GkBvN4T8CX&%aGjs2Zac!Pk-@eVApWl0H^nL1d`#$HK z=e+Ovp7VL0d+SQ2lIdzQOk>O8bNC!ShtJ{1wEA(5TNi;H$7i`U;yJcW0{kfMVSXZBGJdA; zMZCpc^u%)!vtsv7VeU9$HJ}wOi5Nw^L{s89Q}_Y~@j7<;arnw@C$3?|C~=zb083JH zFX14%6TYgz!*86x1^h@XxEQywD>Z)(&f{dHJ`Y{=T@l>0B_g zf^T?~wF+5FCBQ9#{K^*zCx03JyA`{OPgi<~hWnL4@i zs;xG=u^Jyn054ll3cPGzBC+*`_BYg0DmP*kx^QKZbxk)eN8DyCtOa}{w%`+PPO;kj z8nRi8BeQYKec=?6%1jZ#+d zy-`Hf(#AZJb@^Z1IeZSE!{_ihd=8((|3~ou0IMM4$}o!v+5i9m07*qoM6N<$g1l~1 AHvj+t diff --git a/htdocs/theme/md/img/menus/mail_over.png b/htdocs/theme/md/img/menus/mail_over.png deleted file mode 100644 index f9de32d30029fe43864afaeb341ca2204ee30d83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 534 zcmV+x0_pvUP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0UtLYNAnv100EXsL_t(o!|j;eQNlnJg+CnM!3v}Uw*x~3+JUhG=|HGJtw5|mtiVu# zp@Y~#sNnkG%}i#^l9(*vXZFnO19x}WFXW!H2?G(~Sarq`E5HZ%03YB3e67wKt{dy< zQz?-9fRBO4p5Z4z5_Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0UtVE_K&6j00WdsL_t(o!|j<%Yza`1nI6+8X-c2qR}AK>o!$Q>k(QUoBt$}=FXfmGi{`CzvRo@oAW>C z{LeSvYi3f$7zV2hVGv7}e3pEc{J)Xu!0Le}zZy6L+>~AccEuz-1~>?G0zy&-xM zc&Ds0(}L|4X0z5l4ScrXO_EgEB!3Um%ffB9;QYEtbGm`Y7VNVm0ec514Hw$2i!CxW*64qcjI zyc5_1wDd=N&19l!T+Y*pDKpJ?havoG+AF6}& z`kSSey;p^icX6AQ4nABj;^hk9AlxF~!A?7@TLp}ZOMa|+i=P&~DEwLntXH7gb!Z#D zIxhJY4%WE^d;&_;=GyQxd>!Q#2Yh8*pI_=we6H%cAwr?50iFXLz8s>K(- z08fRjj8I)YE$h>{hGB>5NiCAw^jKPDfQi7!7?vNYxoLHeODy>D>Y=RUCpeI4*0mx* zM_D2AY2C@Z5Nv^~<#Qbfz45&;ic8+_3a^w#gXFg>`9JctAo-*MGFq9YH^GZ1PtuAr zLO3~*?*=}o@MMw>U5j;yBr;ihy$yMyYRU9Cm=p3w;Ib?+D}zPabuCI@^}ZJEd$&I; zjlNMA8o9!@N^=#&Mba*xANC|9Z+v9y^t;VvVk+S`sbRn}rPVmn4%`F2#hIMyrw?j{ z$`liIAe*FtmkRvYk{W=ofhB6CN2m~a?<#+ZY)5}>l*)d}%##1l$o~Z`gD diff --git a/htdocs/theme/md/img/menus/members_over.png b/htdocs/theme/md/img/menus/members_over.png deleted file mode 100644 index 8c77498c304af9150165b348fc08498d7aa3f11c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 720 zcmV;>0x$iEP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0U!alBTT*k00K}+L_t(o!|hqoP3$lb91#DP4lotq4#=y3&_POo4z7eN!E|6MczGS< zRe#KznZREdU2# zkjDe)3jsF(jsPYAuK@l6h?19kkr*TMG%-dWmt&MMY(5)f3~@dBTpo5YAM>GkfiZH? zuH|85(*w9Cb!(G3enDQ1{EdlIt!!A%C=e=qlu6-ziFWe*c>j_9(VxH3;&zhc~P+Kleve5A~9`c z4=hp6EXn#@T61;YZDkJz0#HW)n&n`&um=qAmR!gZFY1+@+tq@1ibYxlo95j1K)Zlf zHYkReQz`hPf_0-Pl^XV^Qt&~+x+}B?%x-mB@J#9RNwd+0QJfQ}ZBiZ4Y+Q2r(8gop zZQe3tJ8hF16j}@g%!g$DNl}U^=I_WBZvk8vFn^s~8yzv;vaZr9{7GNoDCfB&;am+1 zzESx6ZX-K9XeXC`G5asB&lE}~y%Hi}e-rRQ0IuDhSb4GRuQC7p)wx&$Zvi|k`1El@ z@N2vK1mH%_M)*A7ia3;B&Oj?*?N^C5h!MaamHrjq7fZfjGB&}Ku3rm2wGvM8`NQWf z8q9NXhF=3)c}!B9N2yLjNl9FabAaD}*4e@T35R22v2@mdKI;Vst06Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0U!j&Nw_fp00e7EL_t(o!|j<{OdVAehQF#6Ewu=g(gKB2FtyeeY?Z3D(Kd=kZS=v$ zq(*%(A@Ri+qi;U=V4_hIH9mNWK6r^q^~snfjUWZ@)?PHV7ZKZv(n2XHSZJXp`0`CM z8Rr~^!^x=_R`@-yUT$j^}ff0Mr;gE95M zrS{wY%jA~;cjM6wyqRnA-M}f} zeqdjQ#J_TU*||`gHlPXU0M-DTY!{`$IS%XwKDOPYH|3iA8^D#o2f$W|1-3c{qr|>ZQfg#hSv|y zxgF@4Oypk!9tW;BcS|SnCVPQ*o%~_oDX*8h>#oXBwO);TBXQ)n0w+wLeZW%STHCom zHINSs14jfs418m|5_rBI0=UfUCqobLtHm3@0$_e<{P)1yF4|pIqGMSgU!P>b zt^)oBUXav!U^!43D%NTvV>*F@z~@H&QComNfjL^ib4~;0~9Nl8=Z7> zCjp zbrSMjs?BmWw%zMBz(tXodbI%z#_R?TO%(ZC zmAX*&qA?Rya~zwrQ)>s5CuL!fpQsF5}Z)` z2bI=qLduY@+B5?%8*iB_l`Vq_KP)?CgSr{u@$P!DDY`C@~Nb<#YyATr90Fw0WJ*v9&?91q(Zca_pNy4 zk$d}M@S~XBF4j8n(xy#`^48{I(h?P>STBkB5b0NOjvC>{P)Sf?&A!cV<7F<$;xsi+ zu$X@mr!lU?h>Lu!>M&-W9Z+{CvLdy;HgxpS6T$1$1H8FPx#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0U!n`N7)?!00S&ZL_t(o!|hqUj?+L8{(`7zE)8`o(Zlip=#~~ygo@${jD#p5qC{7O z8X<)zz`TKZ0`^KOj6{EXZ{RDS9hz^Y(Q52CIVW%^Bdy}wpSj7*H}j1*6A{66l^eLm zaxng2{K5Ex@dxAoZ{u%namE3d@;Us=#uotQ91g%y$G$TFHAmc=^&(=8LPToWPAUCii>+;CxK|`}BNd$j6W``>yi^fVU&) zy#(-K-^ND(zX3c1@MBAzX8=5aJAb28wj$#A>{ng+B~+Vbz3>pD+bWxP{oww2b3f@S<^ z7QS*__*A5V`e%>07G)f%hx9fzfF+alSj}IkUZr90l9F_mmC9ED-Z0r^XN+xlF@4J^ zL%zxq*pi0(9HZ2zQrYgx^Oo`NRp?h4WE?S_hRc$2rHnn{{L2vxZ>{QOb(OyWJm>Rk zHfoV@nzJsaF;_1j=iCnfPXOHJ^DO}P38!%xy8|{QVY3(j84VqMPQ%9Ug0U@z{RZF@ zy}DF=x#zp9%X*=xn9(y5#{k|b#{LT6Gxe=w?2t8z-HhGAu)#>ixxuoY^LbKNoZpnO zryY!4i^$`lB;~TYJye292qVAC>m3x>7GKCQ;A;h9KiEC`>jBQ5pS{Pa8@hQQ{9DtA#qX4=E9J}Z-rDs87~ekfxX24g=R0-HooRSz^m*5~MY zycCfc&nJD(fMA>H>e3lRIK^LlZWS zLcKxbRBq5V4=KB4-__w{gWqA(?Qp>nv(mPySd87MQoZqw+2O~9eaRn}6|ZO5h}_r! O0000hFv!E?qg;k3qU>V~gR&n|6PmZe@r<<=_ doXEkPx#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0U!yv_{59=00Ev!L_t(o!|j;8O2j}Eg};>uim)oI7NV3+Y6hmtbKuO7nLEIvP3IFJGz4F_9h(^F z0&U>ljg$9JKV$&6NoKPq8Cc8}o zIM%Gu(1}f8(D`}bP*BH-^LMJh&j{@9_8x?Lryie zls~|4Y`eG%NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxddW?vyi!_&nvB;xSf znFn(Z8Hlv)S71A_wY{rn0x!p86XhwKk8%#M88}_#oaOxfB}44OpmQ>3j(RW(Y92f0 zcj~vQ_s$qYlySK3jEyXD4_IMn{gy8R%B*D$&m^87J|d~VcI)eaTl0%% zZ(W`?+hp2vX@#A|CPlY6_8jn@D7BU+fUkJ*q4f<}dE0(6S@9Rv`K)>HVWpyLdCe;&SZ<~pMT_vDM+%6B%1>dgyhd=SdN&*Z>O8S^*M?|;AGTF-Rz*_yQ< zO%Kf1t`W8Pyw*2;r^E}PU4BhU{zDOC{T9D#SI@HE%L`is3`Pb| LS3j3^P6>m87qb8W literal 510 zcmVPx#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0U!=1oKY_T00DkUL_t(o!|j-{PQx$|hQFdp3~amtREUL{r4l>511!7%5(5jcF);8X zs7o1`c>-WSVyKwdkSGgn+{7#%Jfy^&V`^7E$&z)E&tHFCE_dx{tx45ZNZ2xbhR^UB zKEpR!w}lvcz@_l)5%4CyS!?aP23qS@=J$7o9dUKmm`y zgXRA){^;Qgpqk^48eSPlJ;$F!+MEMp%fIE2HdQQXvr+RbnY58uG%swj@G2{xnDPs+ zHlHage+#S%&))l7+{ypjL^_OY182h61G517z_BpS74RZ~?|Hn8o7R5UBTi2WUzsv^ z2MjI$0kHpvN>Z9QH^8gqKQVBka@utOC~8Vt>7b;l>3^y=+vbq)vzo84ZgXH+dgYa= z7X4q~T$ES9VZ)CMqP(={3EI4cgjb;l7S~egdubV>^IU4>eH5F8p0-@zr!6Tz{cre* zhhpE>ehjP&<4mORBagQE-P%6`U&1(}JdDIY`eG%NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxddW?> za)F6bQ&g$LQ6-y)ocxaQrmO#8P*E}ucIw4UL@ zw0maqz6|qTRXyZBeKjrG`I6T2Sr4MO@dCB~h=yuqZV&t}=Smy9M_Rmvw+Pkv51FTC%9@2h=n;r!=7PWbV^`MU(K vZP~rUZ*tatzL;p@Rw^gMFOccxby@n*`5Pxp#TQHj`k2Af)z4*}Q$iB}abJjV diff --git a/htdocs/theme/md/img/menus/project.png b/htdocs/theme/md/img/menus/project.png index ae4d177c6cdb769943524b09e643971c1382a7e9..54f4aa382fe65b963ada43e8b5468879ab4c7dea 100644 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iWKS2z5R22v2@7QYJpW<;_5bq! z^8fvRop+nlrujc{0sr3`Y`eG%NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxddW?Ub7z-u>W_#-k-A;#-`jJ6&FK{%K3Q z#!ha}x2wOmPpB^Vf4u+kq;gN~7Kc?)iiwtc4qNXzeBS-7)c0L%eIk|V-5mFs{esv2 z5t*@sXMW{V*?Y@$Qh(g3{KwBT*LK@ z+Jzr@8rgOKY}})(^WpY^ou5?t9-7W;WZicv(=xcKD?ht8Ju7pz*5;o+FE#5dW@fi< z53|#-{b{2$Kj(G|@1gLOHEE6Ojb^vARoi{v7P(~G&s>`uELL5<_KS8X?=$Ls`s-5P orcaBP&dU9xzY*j~>zb8zjLrfDE33{4+y(`{r>mdKI;Vst06z-BXaE2J diff --git a/htdocs/theme/md/img/menus/project_over.png b/htdocs/theme/md/img/menus/project_over.png deleted file mode 100644 index d6c28b6d7ee28267dd5792dd34045956a5d8e92b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^`arDB!3HE>Y`eG%NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxddW?hRC6YJJoDZ6 zhVSOhGu7u~wk91D+Vg-_|HpX^|A^I$Ue0k}yFaLI2*1q{_n}FA&x2si*`Iy2>XY9J z-DtT{D_!@>=MsZ!2fy%Mz0%t@!qyM+PTXgFEfCN9({)R5dCCwzW2Lx|7WwK^G>~3S#8&SM_{>M#6fPLP4Q-bZg5t2 xwW+MmJN9zp+uCTGyN}YOzk*y=ad7_?=9+hBE5&799f5vk@O1TaS?83{1OO9*jYR+e diff --git a/htdocs/theme/md/img/menus/shop.png b/htdocs/theme/md/img/menus/shop.png index fab7db59040300ef6fbcbd91ced1831ac17c4df1..8d8da880f0ed080f7cb941c3c0418750a8a19ab2 100644 GIT binary patch literal 259 zcmV+e0sQ`nP)L5zN4myC5pzfdvT9Pn;R$7oy9z5@&ME(Wdb^2b! zpU^P%q#jinDGZ|;eJcwKnO>CBFvp2g%+#Zd5hjsyhhh9q-^#mget1ykKDIem<}9|^H<8&Tb89dDt4}1A4$c;xxeEXQ002ov JPDHLkV1myHXpR5? literal 679 zcmV;Y0$BZtP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0U#NqPt@oD00JjTL_t(o!|j+qXcR#dhrg(YMUL~(O3WES4E{k8L$I_6DHMxXTE)sz zw9&#sYnv2yVqq^>*_~ixAdOKYDx!koAy|lsB;cLrJ)7Uc5xmXpFcUX84<2(f^V`RF zZ|A*TcF4@wthR+sYzaQWC-?-P;1hg;FBAMt;3Hu2C9Tyr5`L)Qi&-6L0>=jIF9K8g zGo^!{1CI91e`u`rt-S=!0Lx`MHdlc$pbablr-2dq5#X`*#-xpJX6E8GGkarZEi;?V z(alQJGP8zbY;SkX{1i|DJ^(jzbXS09z)#>@j;;orlpl(n`P*jp%FL!6v=h=k7_dKW zX7kcy-ZZm=MKkYOuup*%;FM!d9s;|8@ipt?z#aWw0luh4viU{eZODSHst}t6Zs;Rj zb7IZl^1}SKz-o_a9J_m15f^*x-DmKuL>`O zRW#lQRtIRV1NVT*5b)b|>qFQcjjK7DuX=toT!ZGpw*zKAvteK~XTPOdIIQ_=U-(}E zGoM)lxVDa_-KUxHh2IxA^Sg9xg2i0#*o3s5z`KHR59peI4&U>L+bc`vHw=C>LZ`{z z`Ips(qrvwgWWK8LbAety0(|m;51sk0#!i9QU7yTXB4obn@%-?DuSbC2q4B%gri*R$ zf$v6u&upnc?5Zz(=riB(h~4plH{f@qK3^nuFXVTdQd#=Yn&AI8_&;Knr+6#HVN?JB N002ovPDHLkV1jidGt>Y8 diff --git a/htdocs/theme/md/img/menus/shop_over.png b/htdocs/theme/md/img/menus/shop_over.png deleted file mode 100644 index bda5823f8c36729b82f6d310cb6c7e1991821c95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^`arDB!3HE>Y`eG%NHG=%xjQkeJ16rJ$YD$Jc6R~N zK=9LfcRi5eEbxddW?KUgF*5nBSUrfJ647TSD_CPA~Hl93@QO7rOaQWMF5NQi<;J zWB;!@zql;t9hcIf$hAj0eIJU(K~Zs2K0^h=k>m&2&pdu8Z89`wuwwXn=C40P-`taY z`{p;)e|-JaUPeRNc_|-*{Lk424C@%~{fs+%>u+y|%3*W=NXpY`l(g1;NlE@{uS%m58sx(w#iYncjbx5mfo8T o`CsRpzsU91Jm8_|Kbvp7A39FBd9tU?21W{lr>mdKI;Vst04SH#jQ{`u diff --git a/htdocs/theme/md/img/menus/tools.png b/htdocs/theme/md/img/menus/tools.png index de7f2b7b22164a355844cc2f6c6b738d1e88e4ba..244478041a433f518bece1ee9f40788e953a73f5 100644 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iZJsWUAr`%7FC64z3=}!`(Kspn zaPtlAHz{u&b8?nwXmj%?9A}QuQk8SAWL;{K=%x8jY@Lzu_b2xve{OsJd#;tcO16e! z^7%&DV6D8ABkKIeSn62Rs@CSH`md6@acSeE*1hu{vz6#RNMUz1ez$a8!yaB1moyun zEBd#1wcp&#Sg^FAqs{Hvyp|?&!G$L$84GNBCZ}B5+R?E`-t%^|goOHaoh9GqKlvf7 n;&Gp`W@2OT-3b>8tF83EDz#ib*S~TC&<6~ju6{1-oD!M literal 1052 zcmV+%1mpXOP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0U#SnLAAsH00W#!L_t(o!|mBwXq{CM2k>8tu}R#bm1?B1iYq9R7eNXZL0bhE>YE!_ zX%$gis4t4z7eNK9_#i5%wD_hz6hssaic76l5EB$ptV`WWX;Pz6X>N?imkAuc-tCL` zW`PV0_xt9|%=bUb%$aj;M@q>;r6m?HErMSJzX*O2{QLxe3f5y_K7c>0gzl5LD|;Wt zMHp*fH-O%F9>Y+}(5IA|<#p*$8cHek7W8^kN_VG}-c8kMETy!qid|{$C|Mq?$JTT z$5~DKeg`jx|E9qog%@yU$x+>mSL?Jtgezx|6bH(z`EhKBEHF`pM{CIM#}#!twzi{m}w&F_XE@ zR=hcrY||{A8bR2T$$p5AEw9oBPem4~M$>uzCG2YS@s1YU+pLUW?7`o-H=Z|F0sbuB zYgI+u(S}Q>9y}f!T~0gj{9GMI>QR5>?`|xMSju9z#yWdXd>K<`WZ81?&j95xP# zxhNgPj=K~4+ZC`EpwFyn$UM>iv;cgYU!TP3Rqn(^YY1mW6%ZfxTJb zbwRZ4saFQiblEJgadgY+H@sD2NsUIQ)}k|HgPHCWR+S0jGT{Gd0Ddy6z{v))@_Ag9 z>@Re3yote?G5CErqYm&L4S?q$D>x?j_pCy#L~+-0@FP*~_E!PEGY%ik(B9Z(JFz;J zQ%~#}Q?cgTRvz?c9hk(|C4lGGAFHyppP#0N+6lf@)EU9qlg;etT-WonMhp6Ho&Nxd WZ(6pU8BH(%0000Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0U#baD?v*D00KfuL_t(o!|j>jQS2ZP$N%2=T{`eOcy!>Ea3!PzQ$k9xgNGfY1YQTR zgV;f=VEwY0VURso5m80H)pOiKw)l>8njdWTJ6~hI1@M@e*L3CAmRiws!Msyq?m|Q_wYzZ0Bxk9WB(Ud|ehvB_IFIHk z5fHrUcx5`Fzh>pbHVe66HP4Yg7=wrQ+}B@7K<$=~!n3A5;3cI<(H6SHrIkICf%vGg^*E z%?=C&>LQt~h1bemN7xa3@yQKG3-xwgW` z4lJAxHQ>#w$`UhNt2{*guUwU0e$O5h9_DK`s9n)bM_fL;PU_xKAAIqlAgkCb6rIf*SBsA^0TR2BaMD{MPM)&&C$;!v=840V5pln@eSE9|f04 z6JHwwz`tnh+){1)M(`N&DN>rAf4;X;8@I!Ki-|(VM+cFiWqHu?7y24`%czgLc1f&x oOP_;lMV|@HFLq7%|NGxMpPMEXG=2^^yZ`_I07*qoM6N<$g6e)Wq5uE@ diff --git a/htdocs/theme/md/img/next.png b/htdocs/theme/md/img/next.png index 953731ca93435dad89d71d2f7574a86cb1be85b9..3e386e112d8a9da3935f13655069b64226523287 100644 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mY&~5ZLn;`PB{D7?x!@3SQK#*H z%Tz<7GirV}WgbmAdvw_w1}U2(ANZH`Y*4ak=uDKWonqiLRe*ul!D0ggL*Oda%yum~ QC7?kJp00i_>zopr0OpA$ApigX literal 622 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~e!3-p0EYEHRQo1Fs5hcz=sfi_-`FRQWf+uf85Ct1 zlx-Q6ZJAu`6qM`)B$KP1vVo|@3y6w)ysD=JWfuok&k1S)qNP#U)lopQXKmD!t;s!0 zlc(%Wo&!Y3vRitxdzNM|JyzV(Q@r$Cbx%)q&z$NxTdUWetKNF8rKhK*XHLu7V=Y_H z^-P)5vvh0E-fL5~9-A{~>72D&=j=VVbnmsL$L_5?c5drl5IA=2-Z>z+cJ17~=jZOd zKll9owdc>TJ%4`>2%dw$dm#7@0sp`M2Z2*xR!RW9=2{Zu7Yr7lkYL#KZleXzz!{z{ zjv*YfvIn!dn+zlxE?)16xpwI4iNMX>Q?Bf~7&>7e%lZHReN&%v*w6nJ6xzxsu67ZL75RDl?r8`M+e9_S~n!jI;hOSU<@^F87_nmRX^O+GX3# aKd^58Ea#$BXqpCeBZH@_pUXO@geCy>!9cG7 diff --git a/htdocs/theme/md/img/object_account.png b/htdocs/theme/md/img/object_account.png index 46be8b6fe0f6c733bc1130255b140d9d0da85c9f..31628692b72e75bb6ac02d4c7fc671bc09bd0399 100644 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mYCT;XLn;`P4=`-vVQG*$?A2D! zqb@n8P;)}!jI$qRKeQKlmulb~u5jqW@ej;ey$!D=w+MPMN!m5C8a|9~3!AZsO+j4T z=757%27?o;!dr$V!T~M<3^`kvue@UBn8+Af!ob1XP{K4}UW1AgQ^Sj6oazGdk0vl2 e;S}yD<7e0wTpS?3RyP;u5C%_IKbLh*2~7YqsW`O& literal 453 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j|L z6La+x3{4gClS}jzj0_A+6%5U+j0~(yOck^Z3=IsDBr}!)b+VUu`ns~;Nn{1`s{?#OT>t<7f9=|}y&!Px z+_`ht?%jL-{Q3L$@3(H*1p>+0*~Qh>Ej>L`jvYI;cI{eCO-(N^uQ_w(0ELQ+ zi-UrKs;jFN6%_>p1h#J7yL9Q&o}QkTmX_@7Yz_{NIdhgynKEa}lqq|U9b39|?Y(>V zzJLF2X=!O_XgG=U)C!<87)yfuf*Bm1-ADs++B{txLpZMIo;xXYNI`%lV8$YW4pr}z z$qlnOe*KTnm>}~uc>iG^Qzv%=JFbaB63r%mKDHcqHzjm=T{VNkl1rs8uWSptr75PXuZf&hMM19jD4j$kMHR4^7V0K{(n~AEz+)@Zw;qZc}7uDECqRe>`AMIM7Z8Pgg&e IbxsLQ0CxQ`;{X5v literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSL74G){)!Z!ppU1EV~B-+@(+Kdgca-8w;OdbEAY;!dSiR;fM5s*+lJc?4$OOV zDzq0fxwDu!M5tsO$Zx*nCU4P{#qe6i^{~OlMh}Kd3}$mPKK!?5_?j)8|83)j^+0nO NJYD@<);T3K0RT{uGx`7k diff --git a/htdocs/theme/md/img/object_action.png b/htdocs/theme/md/img/object_action.png index 0b02fada4147e31e71f53a800b91839be9b66f07..3a777f181d85869ea98b895c6ae7c61a7923efd9 100644 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mEIeHtLn;`P6?p%!JJr;*O?F^> z^MPfO-kk|yT^ks9TxUEJT-j0dS|hZDVTz`b%nbDcEz465p$rUWyb~stFYS8*G=ss@ L)z4*}Q$iB}iMS!i literal 528 zcmV+r0`L8aP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=8 z0t*4d6%UR800EFmL_t(2&vlY9Ya2ljh2PtCV<`mOL`bA?qb?w6Riz&Upa;0sAe5=n*-UIT!&_E&ip6C6#a(+duV!yRMHcap6VkOY$35qu~$ z04Qm>Ua#M5kvy%6@E9gOwcIl@Et01OKpKIn=r0^y@r+3g$$e}NjYgw;053?^LI|%U zjbnm+vq?b`A%wSs!C*Vq_D^g{x+0l8v65u1&0~`w3D(-`{gnZbm2kz8)y9--g~^Ph zb4klM2H}4NKaOfC>D<=q_212A^9O+AQvAHb)%gNA@!ntC#bSZgYIW0Yw`TzMNWR?A zEXFT)l4aRNQ53MwIn3vC)M~YxMx*fwz^x<$U^kk5lk`E-nfLy>C<^p?J^TU2f!<4^ S*#w3F0000G;}&d z3NRS`d)&w=;L2MeY8v2wam6Bw6j$yI$6{r4-bo#3d&Hg~%hJfiY|6lJd(pNumOqEq Q0u5sDboFyt=akR{0IXvn(EtDd literal 675 zcmWlXPe>F|9LJxA`chUVP#pRLyAa``m$i}>$=qQ#-KjNs8q}Q3A)$sM8mYr5RL;R- zy2MbSbDfLy>@>%Lm0~E6$7=Xi%7*?xQ*@Y6aE`CH@cn&%pYQkj`#qf)A5FC%Z3h6P z%40>ucV}bZA@02|zy9Q_Nk^j+SR=>(a9)_WJXHb!0+0tl0zd~)0#F75mjMJ5LIVmi z6bvZJP()BvplHI3A_$@&n1Uz@q9KT;khO)JD&#aF?~0-+O0FnjQO239mB~37$<1&^ zUPj^aGpe7>=d-etMQ&E{vOH=*4&j_0zZL`7SSB6IaK3~M>LY?F4b|U<47loVG{#~h8GzmHf`5* zsmXyPmLFN%X=2-s?GhV%wjbC&v3V0R2U91YPMEkJb-mE#5Hak9IEXNfaG2nTd12y3 z%#RYEd(46;31UW~m_&?lNEnS18Z(-(FlJ%GA}+>a#umFTzG_@$4vkNOkzYHrjWBa* zvN(fjvpKxMs~6>BVG7pOY0%tV zsZ>h0T48N_@SyYG!`fu6Wq;1^_&b1B_1)_Hop@_`d2jE>@8YpsYwOj0=XSdH!QfJA z^V@9ge*Y?H9y(hexw4S1pYMNr=0kaB<6Zr;xl;JF{v}->M%Q*~RqCu1KCV~OLw%=C x_ib0J&sH9#CqzeojoGi`1S>%rfK)EztT$84s{0EqyHfsO? diff --git a/htdocs/theme/md/img/object_address.png b/htdocs/theme/md/img/object_address.png index 201577281f048ad530a5ffc90ae5ddcde1ea09cb..b35923a7e4ff612a9062fd6d52d18d8ceeea497e 100644 GIT binary patch literal 227 zcmV<90382`P)5Q- zODY8b06@`G^kM;|Y``Z2nK5RnOxOvw;#;gj*}|L3BK+rE89pB39R6&=mVNs+P58!| zTS;L0Z}plWdk}vvjJrS(g|RMG6Aqb7$A{1XxV@ckc4-Yja>Hv5+YJ0 z`@Zk)|9@v@%2$@0LdF-ORexYj_a=L>JU3B;5xtXV9(=v z7=~AQoFqwQjCqhVOm0FZM+J(aXn1%{@;#lN!cJf-ut%_WFfVNuGZ zE9D-K?ne(ih?E>DjohI=hq~2#Q6&T{Dmml)MoX617w|ux5f5W7c>n+a07*qoM6N<$ Ef*ux?eE;qC7deI-gV#sLmPKPPKoP`2~4gY4BHp6 tvB+p$vpurviQKv+O$}Fhv{Y2g80P=%EqRyPbsA_1gQu&X%Q~loCIAF9Firpf literal 394 zcmV;50d@X~P)t3@7BG}t(3;SweQ}>&b6HH@9(9Yl-|z0&b6ig|Noqv zjMlxioRoz3_xI=L-qzO6jEsbgjEr-0b8BmBLPA2$&d!{ioZ6koWdHyG0d!JMQvg8b z*k%9#0CP!1K~xCWP0HI6f-nq4(NJtPHeM#9MnJ`Q2ekkHc|Jf3`)$oR0Dy=n5MT&Z z_1tNgP}`q|Y-H1R-;vMPTRw@#(xa3}q?=si9_dMZU0nw*nVD^Mn$jJMbmpC}_lLN8 oqSbn{?P*Ltv(C*IJ+l;qC7deI-gV#sLmPKPPKoP`2~4gY4BHp6 tvB+p$vpurviQKv+O$}Fhv{Y2g80P=%EqRyPbsA_1gQu&X%Q~loCIAF9Firpf literal 395 zcmV;60d)R}P)t3@7BG}t(3;SweQ}>&b6HH@9(9Yl-|z0&b6ig|Noqv zjMlxioRoz3_xI=L-qzO6jEsbgjEr-0b8BmBLPA2$&d!{ioZ6koWdHyG0d!JMQvg8b z*k%9#0CY)2K~xCWP0HI6f-nq4(NJwQHi(l^qg)N%LHYmB^8s4fZ)?s007OKA0j5w@ zt6qbVnYH`ski=ErUH|#>{&>nO(pb9X5{T4FE!RL#;+x_!al_1Pi*inPI>$5beRDX5 p)f1)LY&X)F#nL*rT8~U(06(yq36LU!1SJ3f002ovPDHLkV1l{)y3+sv diff --git a/htdocs/theme/md/img/object_billd.png b/htdocs/theme/md/img/object_billd.png index 2080958f0fb04a7ddb9fe953bd9294e3666d43b8..19d4be8371db14278febf70be41acb3963dd7d0f 100644 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mB0XIkLn;`P6;qC7deI-gV#sLmPKPPKoP`2~4gY4BHp6 tvB+p$vpurviQKv+O$}Fhv{Y2g80P=%EqRyPbsA_1gQu&X%Q~loCIAF9Firpf literal 341 zcmV-b0jmCqP)t3@7BG}t(3;SweQ}>&b6HH@9(9Yl-|z0&b6ig|NoqvjMlxi zoRoz3_xI=L-qzO6jEsbgjEr-0b8BmBLPA2$&d!{ioZ6koWdHyG0d!JMQvg8b*k%9# z0Cq`4K~xCWP0C#p!9Wa!;dI%p*r1a^*rMWFOaK4RbJ1qUd-u#a0DzcKpocM3)?=sU z#LTJvYG344-);9XCcQtN@-nLPbW37Hy2wec#z+#I`aE*Z%;qC7deI-gV#sLmPKPPKoP`2~4gY4BHp6 tvB+p$vpurviQKv+O$}Fhv{Y2g80P=%EqRyPbsA_1gQu&X%Q~loCIAF9Firpf literal 399 zcmV;A0dW3_P)t3@7BG}t(3;SweQ}>&b6HH@9(9Yl-|z0&b6ig|Noqv zjMlxioRoz3_xI=L-qzO6jEsbgjEr-0b8BmBLPA2$&d!{ioZ6koWdHyG0d!JMQvg8b z*k%9#0C-76K~xCWP0HI6f-nq4(NJumHeMzpMnT1(sDSeSpC?Xf$Njc)0s!_Gj4(%~ z(0PzxA|dHNGA5of9lCyads-1`A5VToDvkG&11&au;ai|Xc6D`~xuhvwo&ISK$M{S; tR~P%RI>gm_v-MOeU1(#n+%t&*d;yi!wqk+PCF8{NUfd$e(AjM94uKQ-#;U%aml>V%XwR7!~xz dHM~+87(99#8hq?|z5z{T@O1TaS?83{1OV~(CF%eG literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=%3?!FCJ6-`&Ea{HEjtmSN`?>!lvI6;90X`wF z|NsAAyLRo~y?c)xJ2qv?lzaE?egFRb`Sa)3u3g)@b?dov=ia}6zjW!+mX?;D>e*9) zx)@7>{DK)Ap4~_Ta%??a978y+Cnp?Ws{raQk(7{NW!*Z>z@XsGy?xc{%*@$QuQsVD wOqE*7y2wcF97|xPYpO$6;LRHmtjnYs7Mk%eyI5Cl1{%cR>FVdQ&MBb@0LwH@(f|Me diff --git a/htdocs/theme/md/img/object_building.png b/htdocs/theme/md/img/object_building.png index c9d1539dddcdce4f285117d26cab14ee97ddb90b..efe44594ae8c783c434517c0a8cb89e81c098edd 100644 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|m96eneLn;`P7if7TSTrzgY+`Hs z@34~HKxny=$)pXQ8Pn7SLRg-d3T)w9#c^4sLsVgshpY2xt1|_MdJ=jBmMbwZ*mc%k UVJLqQ0W^%k)78&qol`;+0EuNJD*ylh literal 563 zcmV-30?hr1P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-xk*GpRCwCNlf91;Q541RJl^EZ5JN#8OeT|1NU;U6Fig~f!it1$rN9siV~oU@ zXktZeBVil=09&xJprYJD3wA3E1qDpd|| z^PZ}z+J3*MrfKE|gTb>(rJ^MQgb>hdHet8hK@>%xX&N|=1FcpI=JPq+!~yH~`-5CA zM<}IK2yxCiKN${(ecQH6H@ShRR;y>n<1r(pyh{jqsVItDuh&1XRx3ZTiHOL@OLn;`P6?p%!JJr;*O?F^> z^MPfO-kk|yT^ks7X*lgjdmx&~WW@BD#ZT2;as?N|{j|2(T&kIoK+O!Eu6{1-oD!M< DhNT`A literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CN!VDyL#uerODaPU;cPEB*=VV?2IYI$GA+G=b z|6jIj*|b?Nu3o(gWX~_#;#?)61X7yh?e4vL>4nJaD4z_MyE9? lK9WujUNMOxAp(mS8H6JFu1;5C6$k2M@O1TaS?83{1OOqAH4Oj& diff --git a/htdocs/theme/md/img/object_calendarday.png b/htdocs/theme/md/img/object_calendarday.png index 5678cdd2411bf87a5a55920770749aaab067ca5b..75b1de981da4344286785aa815b5b0eef23459e1 100644 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|may(reLn;{eo;}FvWGLWzG5S<| zcbDoC5pPfLlO_gBm$ckJ$PwwoB+1-Waqruq!?G%Aoz1StW=Kk=mAAAl?2+Vs*d^Rk zA-X(Y`L9Kg(k?guqWfx6%j>)3mh8(lsgdVYmwL10LEaSut(YGx#aZGCm@^NTWCQJG N@O1TaS?83{1OVlOIllk^ literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CN!VDyL#uerODe)55h!U67;^d;tf|AVqJci`N z9Im`{r!WPy)*8db&7OLn;`P6?p%!JJr;*O?F^> z^MPfO-kk|yT^ks7X*lgjdmx&~WW@BD#ZT2;as?N|{j|2(T&kIoK+O!Eu6{1-oD!M< DhNT`A literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CN!VDyL#uerODaPU;cPEB*=VV?2IYI$GA+Gbw zw*3G9f7!BS(`LQ6di5%hZTl)U5Tvvu$S;_|;n|He5GTpo-G!lpRn`N@;VkfoEM{Qf z`T)X=PHRkN00r4gJbhi+?{RXltFf1CoSO_3Qt)(f4B@z*Y{16McKJcT^$7|RsTw>Y i#!7AiYi@TiGBMOF<2MpC+~@;T%i!ti=d#Wzp$PyHSUGC| diff --git a/htdocs/theme/md/img/object_calendarweek.png b/htdocs/theme/md/img/object_calendarweek.png index 4ea2c09ccc96b569c2ed0e2aac8f2fb0b987cdc2..50c65619ee337320b5fdb57105719d3f3bed0c59 100644 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|ml097vL>4nJaD4z_MyE9p7fyGVSSrQE(s+bJOPaY+u~|Wa Zfx$9|&+>+|^+TX?22WQ%mvv4FO#u5)GkX94 diff --git a/htdocs/theme/md/img/object_category-expanded.png b/htdocs/theme/md/img/object_category-expanded.png index 8168f76fa26b3e8f5002b4e21966d23e5f026cdc..b0292d92aaec99817b1a0dff1c1c354cd715f10c 100644 GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|m^gUf1Ln;`PB{&KuJ+zlGdl0}p zNoCC&d%ub%3D^IDqKS-$-31>iSTqKo3}pMo%up#7bIe~t{RvPjgQu&X%Q~loCIBni B9XbF2 literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCbW2<#N}P*Q6H7Al^Atidb5j{| zQ;YNzOce6+%k&hC3=Aw43@xopEPzNs+rZGkpdseIDo`VPiKnkC`%P{ZVGhOxFQ07# z3UL;AL>4nJa0`Jj5jgR3=A9lx&I`x0{IdFJ|V9E|NoCj%6swp-I+@_ zfN1}*vp|_|-+#oeG_wG*7)yfuf*Bm1-ADs+d^}woLn>~?_Bsk3P~cz|?)dWGUXROa z8~1csXBGy(4G)t~md(;WZsinQ>G~^l-sxAFNA#jjO3Yc_T3v8=nrF}A%~>pk;n$Cg d|FEdrGlPvW{na)08JYD@<);T3K0RVHlW8we+ diff --git a/htdocs/theme/md/img/object_category.png b/htdocs/theme/md/img/object_category.png index aaea38dbef2c74ef5ec519976be9b70ecf4e94d2..fb51c4b100c90c3e1bcb801cd16e0226cd598516 100644 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mv^-rLLn;`PB{&KuJ+zlGdl0}p wNoCC&d%ub%3D^GZ RW(G8g!PC{xWt~$(699-`U&a6c diff --git a/htdocs/theme/md/img/object_commercial.png b/htdocs/theme/md/img/object_commercial.png index 36cdcc8d4a2d0220e02cdddb5d62dea514d60a54..5f6fbc4ded6b2159c064190495590927c090cf1d 100644 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mqC8z3Ln;{Go-*WRaujjB$jsz$ z>{il5hPNW;IXxsb7d)Aqv%;g!(dne^+po3Vib)Y$Y_HySj^^z6bn%|nY$I16)!Cb6 vH>{c`EO1r$Kj)5B^SBF2%%#oQ?ccEG-`%vw?~&Unpe+oZu6{1-oD!M<2e&ix literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~x+Sg=CC){ui6xo&c?uz!xv2~( znYnrjW(v89Ma2q61_q`I1_o9J=2iyA3fcyS1_sq-mEJ&&>?NMQuIyKtS;gh~&R(+K z1Qg;d@Q5sCVBq=y!i-L9OlANDS<)SS9T^xl_H+M9WCilo1AIbUfpm3sbx%*voH=ur zE?pWF6qKBtTwGk7ot-^p%9N<6C?_YUmX;Q|rF)xzN*POn{DK)Ap4~_Ta@;&!978y+ zCnq>C9Ck1`8az#rVNw6`R7nQSXPZ7rZ74X(*s;om*&uf^$Hml%Wei^C4VmBiSPaf; nFicDjF>A{Z5D`gBU|`rYle_!xQMrpi6B#^R{an^LB{Ts5*fLyA diff --git a/htdocs/theme/md/img/object_company.png b/htdocs/theme/md/img/object_company.png index 2a582b8bd4c899f370f0e74a234005c1f00d6ac1..efe44594ae8c783c434517c0a8cb89e81c098edd 100644 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|m96eneLn;`P7if7TSTrzgY+`Hs z@34~HKxny=$)pXQ8Pn7SLRg-d3T)w9#c^4sLsVgshpY2xt1|_MdJ=jBmMbwZ*mc%k UVJLqQ0W^%k)78&qol`;+0EuNJD*ylh literal 492 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCSkfJR9T^xl_H+M9WCilq1^9%x zwoKXT6x8Ar)e;mnB`CQkDtk&Y5EW0!E}oNJJ*T*MX)%zjURvBTr=@3Y%apa2UM)R6 zTYILg?U}N*XU^6sQ?^b4l5_UX0ivZqbZqIIy-Sw@(Xpj#_by!vB+so~du%O`+q(_1xaA*Y@r`w-?AhcI_Al-8%`sfRYo}>T^8$<<0pVZ%ROBjLn>~W_TA=da^P`!&HG+qfwWoBY_?7OtFN+MKmG52 zKd0OCw<&&V%pbaM70Lf&@c(kO>UYCx?azxRpSzr7b&5g!$=rFq?`jTVlx-W=m~m>2Zaq~&?RU*>`)(a(<`U%L%-GJ~h9 KpUXO@geCwuwC|Vz diff --git a/htdocs/theme/md/img/object_contact.png b/htdocs/theme/md/img/object_contact.png index d4272f367c6e5eae37c9ddc745fd8a9be7d05bb7..16030c443338558c86faa43bc79a985192a1857f 100644 GIT binary patch literal 280 zcmV+z0q6dSP)Zb-2VpCNmJ*t7&d46qB22sOb0+Dznm7(kzlsUpv`S0>Hd@d~o4=Cz}E!#Vya^ z#GBvpHZd>|tUW26dX&nff+$F^^70c+#P*8y e4W)YO4)qU4f?~Ksdef%>0000t~SR@^Yio978e&^7K_CvN~u_@)q4B- z{YM_$uCTr1AmxCz=i#}MT6PCxYirlq+uEgW<^=`LI7=|dN==FM}(`okh4mmtJ1;CRomSs^WHa2YA zwmV}eiXw)?A(NAn%*@;)2+|A~0FcWjaGW+KK&R7@LWo{EoxU0b0bv*tMG>Cok;&vZ zIZ?=g1VCDV#R%+nyS{DPb>H__f*@cx9MbRi2}8xf!7g9ET{^!p0hH$oBXECze^{wh zJ_#XK&d$z|Qj$ugn4O)$wyQj}VZeZd1^H}_y3-ti{eC}cwOX~Qsi|jD%A#qSXs!9F zCWw9i%-0K!TyPYXO68Vmn$t=tUx-mB;&BVvcPZVOW1^VE{}qr(Kt4ZmG*(wvw=K)M zp_IBVgvctT3;-bn$z+mLDueGwl*{)qQx;N=o@1=7t!cwB&|0Il{v(oM7>q?u`!VF^ZzUc6BTiMG-N6P~U!M0PNJ@H=iT?p!Mv|2><{907*qoM6N<$f&fV@ AF#rGn diff --git a/htdocs/theme/md/img/object_contact_all.png b/htdocs/theme/md/img/object_contact_all.png index f571504b24677f54c02299d6eb3435fcf1118788..cc204fdcaf1f376df619bf444699ec4123df7d9b 100644 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|m3O!vMLn;`ro-*WP43uDacwTUa zxVOrpfbQgsnAXi5&2OrA%d%IPN#Fc)a&^fWli;5DY0BPG8?L@y6Pl8`f%Wf=NLQ|4 z^Rl3e8SK;NpPMxGeWbpHC?x?)M35G!;_ERwD+M@Xzh zRuPj3jx1;j=6*>>katcn`czhol(HE{(y0YqXsMq**B{Y~=ga$f|MKwgw7Hr6w)BE@ z48v?rs>*}<%6O(GqPnd#s|K}{W~Ylxd7HY%mX}CvgNp;v|DpEKd0e0w>~-1W6MVL(m+F28tmm z4@r9{1ns35AC2&G3{5kPmqEg>Fr4n8Ne{xWcsbe2DL$6>3A#@JEP|6*(eQJ;pO^gs z!!PQ75pbf;Nr00~PLA>%%gcb5O<9LO=?c64E-93@FQ@teUa`6kHi-AmQ|-j8r~Hw(JKI(mJAHYuJNZHW!Gg6L zGiOd!K0UGd+w?+l{yIGz`4wJn%=^8x^lGj%lbzM(hwhH^XFhi{T@9`b-oF2}v2SbZ z?n`3(Xz7L4^JP=-idxF69bz9g=IXD*U%GRO_ug!X1S^&{*bZ0sZm%oOaO~Jr=eQoM z?|N39JMcP3EPOcC7Ak6K9ZMGH%&FW}!}EXi#fW|VNM&c)%&uf~H0C6ksvd$3{so|5 B#G(KI diff --git a/htdocs/theme/md/img/object_contract.png b/htdocs/theme/md/img/object_contract.png index a75f954555ed53222249ca6921a7df634949d1ef..6e14b35ffbbb4acc323abdfcb9ea0d37421ddb97 100644 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|md_7$pLn;`P6VbMvR%@TG7BE~WY7jrPScPbqctlt6eN^#W-#{vyz@O1TaS?83{1OSB$C_VrH literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD>ZPvx-Yua!6$T019yy zctjR6FmQbUVMeDlCNqG7Ea{HEjtmSN`?>!lvI6;~0X`wFQBhGrK|%L`;M%!+=Z>A* zyY|}FIp>!4{Qv*|`}^nb?_E2#b!&2R^4_&`fc*E*pJ!)hAKSV%J30B>R-nlD;_U3_ z*N#0uxA)xErRR?Ay?1Qu-mOcYKYxB~@7`m_j;&q0wxy-z{rmSzmoA+$WlB#^&)%(D zi;IhE{|4&;9l%%;F3P?G@z6(VpPJ4GRVtiNc zl77MNTRtO${sTq9osUywy>}?9*XGNgOM3fxtE%ejYfId=x~_<|`a8qvY=C~v_pMng zj%9u`&AmRo=5uK1+EV3zXS;(qG@q`IWca{3|1;}*MxUe;Ksy;cUHx3vIVCg!0ND|w ABLDyZ diff --git a/htdocs/theme/md/img/object_cron.png b/htdocs/theme/md/img/object_cron.png index 6186d18da70caa5acaa255752415d8136edcdc98..8a3a5091614a7b394b736de789d24c29d5228623 100644 GIT binary patch literal 284 zcmV+%0ptFOP)a@-wJzzHV^TJ~Qxn$Wnx?X#R$&#j*0%S({TH(1CLrv++W=R5vJT*} zIRINex(v+tCfPG6?VBl};G1JTgHHG+-z%u-xll_`?q5480LLwOY0Ft;d@~7L_R*$R zHx#X6$48d{?s_Mz6^BHMFuoMO9T?(juzvoh@l6oRG2Oy^4?ySKV#-;1Bj( i($f{w@^U6!G_LO~|kR?MNMiPaA~<1&fT(45k-CkV*f&VThu-2XQXM(%4mWz@--t(5WD?%;ydD zp!s-7V_=jxE>)_y#2KYC<|Tb(O$8l`0uFU5KrdYwShSp`(&zS#gJigYMImSISvU4z zFrm>ydDaf-%lE6%AKH|7-_dV*tXgs{f?y_`pObaUn1lfb8_)qC6OB50%FCxBVM#yM z&`;Hy8ca_n{`e*PVV{U?yv>QrVfv61fdp;7D3RaNFJw&%ba$drB+fMO!8;*>vNS%G}%0G|-o|Ns9-MMW)Ls`&r^ zwg1P8*i j9hGeOUEbgI(M#rK!i*gTe~DWM4fD7IvR diff --git a/htdocs/theme/md/img/object_email.png b/htdocs/theme/md/img/object_email.png index d5cd141733d3b07e6d6348aaf0afecac51346718..977c4cbd8f91a5c010de1e00ed9938b64a740ced 100644 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mT0C7GLn;{ep4*t)93atpQF-q* z=?%3=kGKtrz`^)TCo*onQ?yR>xy7m7#wv87TutYsfp1P-n z?M2HHGra@rXRDM*z7#F4Rr7CMT-SMM#k82eKguTF=}l_<)P5>)-6{F-fEhN=)He1O p{qMYGAILmqpV`UfllOjSi~2afa!u=$a-e${JYD@<);T3K0RRIkPsIQL literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUDwQKjTT?3Nu?}5Pcd-vWye-1?7--Ez+F!&Dy z$?j5{fhJ3p1o;Jn_*emhh!VpspsIRL7sn8e>$d%oe9VR%&X;qRs5wbZ*mURrqNS5F z|2BR}>G8SIzawP+Lx=nW@~jelSAV zrHU)zs%iUU;}VNMzscPu^2exxFYuw%>Z}a=wE>#fgTLv`y!3t| Zf6-~4uQJ`9B|xVzc)I$ztaD0e0sslJwVVI| diff --git a/htdocs/theme/md/img/object_energie.png b/htdocs/theme/md/img/object_energie.png index bc3966d2fa2e83c5810278c33a37ea5fc6718d90..668d1bc68a13e0118d53a2331c13be10cd7a7933 100644 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mQaxQ9Ln;`P6+~4GOcV|>yy@aI z_~YKh$0Evjlcz=0@% zE)juZ6I>lGy0WDm>Uz^?!sxo1V|j}ao8_Ud7KszA4Datb)HfdAHXUdogQu&X%Q~lo FCIGsCGZX*- literal 376 zcmV-;0f+vHP)PH|`)TKC4j%){7qahG30Xwj6GBWw(PPOFTUDu!ML>SyqD^>bP0 Hl+XkKHBuqP literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD>ZPvx+nEuHMcj0uX?%lfe*xtRzjvYIp03V8*}>pCo^YWg|_K525hyQyhXKy>}46&cI5UZq}pxYl&J)vnXCN( diff --git a/htdocs/theme/md/img/object_globe.png b/htdocs/theme/md/img/object_globe.png index aae8bf6eba03015d44032e7fafb2450c05a19dda..4c4a2e48c29043e83face284e3c33a7469578774 100644 GIT binary patch literal 305 zcmV-10nYx3P)~G@W z58s*iThj$=vt6$4nM|gus?;45dvQ+Ty&9z2);2y0UwjoNww9U_x2^rtlsmeo;pCN; zg=ISX!A1i!Kfo`4(XurHsM(A1C{%%`!W+4%Fp$fQgimsBg(pBJ+`voWF1Rl|$4#M6 zT6$4h>Rq23O6T4Q9iXZZ=bRiIoRY&U0Am|X%=`qu{XyH-5P-Usg-2dHdf=gudF;Qr zibTuG&Q$p3yYN|It^ujKaq`rifr?T!U418K(as|6!e|CXMMYM0o63^NB9)?xg%PAt5GI7U3tF}EGqiHmrf=E*ogN`4 zX7O7%p7(l=b6&@V#ITAxG;n~4f9FCUvbewtTKGmAZ}6i6_f)~MU!#T`&hdzMRqqL0 z(7{a{BY^^zv8LaLc*b@&a2#c|S;Q{pRmuLFMPAj;)Y+s{?sZm@qynvrw36DaSMJa7`{-Aa4Q#1ZTh^^Q%HRkkrvoJozl1?8$PZ@u zO=L+2kiu&)r&_3K2D^quoMKKD^Qz|QdhE<__c|5|OMZidWO=w7G+TGot>S$+wHz+x7&~Fx(1-r={#4}OTg3rfo5-S?_#srEUdM8N(ogZrG$v^?%ms$ zolfUrN|Fr*gIB}hu)n{*?*MY|{ZgaR$YYF%2qHp^k>T(MH#d4u%1Mc!+_`)ExvHGC zu+!;uURBkJh>%hu#z>5Ta#AuX3cT~U`JC^E-&tQ@djgyXuvJw#RsFDlQc9ejR;Vh@ zIh^-+@A2MYtYx{qyar&0!(oUqz7HYboTIL5@;ql$6hS26y~BG?2!Z3{W6DYS8^CUF zZ_9W*ejP&i5kkOPi!o*%LwFy2z&p=uHlr*j6r*AW`~t}P{eI6{dtFtXF$RE?(qXf) zbXd>kRMiR2Ia;k2RkAF*w!XHu^7Y%-=$y;5EF(pkfBy94 z*#fkxdJ9+<5d$D1j7B3)PEVH=@&wwUJ%)zvhHqgC>5pv*p9oY0`jMs$`cQmD}v{YDR5Xdz%4GRi(@fCP3jdfvt%Mw!lFP?LTfa@`YvQIk^F^t+ z)VVn}ob%CdsbmVNKZl9g>sKi#mCn&y($k%Y5I*X_hkFk9e$V6HYi0EhYtN686w0;g z)(#x2)#B_D70$qM+tucuRxgs zSFf9(Co7Z?Fl`vTay{{A%nYN`^Uypx595=w@KnZu2CV_44?EYMf3!3T%e`=bjFDig zE;DouzX2837fLn#Agb15D5K;65l*9})4$r|2?MJxV zYl7#hJV<8RLs~&4@mE!Gm>nfZiZgVI5+bFtiO5&9LaojK9I+hE75721ZW@e3&!C*g zg2eb35QRFdo_#RWpW2+@P4XEwOLGMk=$Vp>PE}bUwlAdD13<-(02Vvi%!@qA$3h$$ z(UH9fJH(Eq1f8iqL(;G%_wGG*?AW<;=T4P7Jb(WD|NsAU^zA+Z^$L^(`2_>H z$bjL2a;zj!F3{7(F{I*F@(+GSo*fzD;^K?~Z#O^x^06xA*O|4C&%AH^a&!0FSB3v2 z_ng0TXIbP0l+XkKd0K;r diff --git a/htdocs/theme/md/img/object_invoice.png b/htdocs/theme/md/img/object_invoice.png index b4022e77740bb96770f8fee065c58284e3518c45..19d4be8371db14278febf70be41acb3963dd7d0f 100644 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mB0XIkLn;`P6;qC7deI-gV#sLmPKPPKoP`2~4gY4BHp6 tvB+p$vpurviQKv+O$}Fhv{Y2g80P=%EqRyPbsA_1gQu&X%Q~loCIAF9Firpf literal 394 zcmV;50d@X~P)t3@7BG}t(3;SweQ}>&b6HH@9(9Yl-|z0&b6ig|Noqv zjMlxioRoz3_xI=L-qzO6jEsbgjEr-0b8BmBLPA2$&d!{ioZ6koWdHyG0d!JMQvg8b z*k%9#0CP!1K~xCWP0HI6f-nq4(NJtPHeM#9MnJ`Q2ekkHc|Jf3`)$oR0Dy=n5MT&Z z_1tNgP}`q|Y-H1R-;vMPTRw@#(xa3}q?=si9_dMZU0nw*nVD^Mn$jJMbmpC}_lLN8 oqSbn{?P*Ltv(C*IJ+l#A>U&k?6&ZNsAWdVon5Ltzs0Piw;syV8Fy85O9@m>k&T_3*t~Z*r+4u|L zQB!q_Tnv4pkeey)#0K#06Lm5r%T*~JLpTyayZs9)Rqv}RRn^G;xioUp>-G7Oo}V3I z#E)>L+w0#Cu1YPB7(g;3qo*naP@s?tT{lPrN>tDwho`6A1#!7Up=J(*ljWqg597(rBE<=vvib2y3!cgj}t786&lA=>27&< z-*ePHenYSG=0yO>vTTS@+uMIT>u|y2U#7%(D_1DaHx3V{=~v#cXnkbCem|E2_`Bc> zt@iQMLA~*ex;~dQxy@i3{%~LbRV2?L>KvfK$u6{1-oD!M<+N2cH literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CN#0(_Oi7|Nr0WpDPncQIfa23quF1tOt<8S>O>_%)r3)0fZTy)|kuy3bL1Y`ns~; zU=|UPW9nwQy%Z><;OXKR!f`#BgO@jT#sB~8J*&gkGG4wKAa(3~)Yc|O4u%KcMf#)P Sh<^d9W$<+Mb6Mw<&;$UTzBQTv diff --git a/htdocs/theme/md/img/object_margin.png b/htdocs/theme/md/img/object_margin.png index cd0eb4109f7768afd725ee12fc5213b3d4c31adb..b8ad5b5cc2460224ca85ccaed177b9ffc9f9ae03 100644 GIT binary patch literal 92 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mls#P>Ln;`PB_b{y_#n?A{bKzI pMix%ZU;Ir=w3;}1^u4^P)JmY-AwgLbNZ69N!67EK*kWT$3~kIB zC&X+CrS0+U*o{#YVKUOIu{{1Bd&Zx|ay7iW1&##&g5o1-NUmqKcqq>5if66P zAal!deP~4$qPX{D9;U!Xib9B?5Kgh! z&GX1s+9)-8`kK=JjV0d}ZqL}J1BoLai5EM98?pQvKKbpK`|t?mlQwM6oi_tUXmJzC zqwp9Is>iUs_&goh7n<1P>qr$_pt6Vfn#+zsxqX3$FPEkRn{*C&xeKn^L!mw(=|dpl z+9g5+{0=h2B|f` zJZU6TpnP(n7ifnVq*&yRJ35&8uIjT$8p;u%&4E&*4@PJpT{+hwV`il@Ec>DmY8|-a z>B+!qB#o^D0fJ0gw@!YetRh3&I8{=>hzdNBq<$~7FHQy)+|=yd2XAPS+Wk2PIc*Qt zLVMUqmAsg!O6h&K_Dy19g;Cjf*IRu4Oljw`wO{bPPfti9%ldm002ov JPDHLkV1lRN1oHp@ diff --git a/htdocs/theme/md/img/object_opensurvey.png b/htdocs/theme/md/img/object_opensurvey.png index b5de3223bd4944e9ba35075c3c6a0052731a12d2..d1f88f3c794510b47ac4b97f7d6568c3b6e24b04 100644 GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|m^gLZ0Ln;`P6~yMG{OD(&*P!vM zU;a{?P)Qy!jUi)4FJ@#+a+0a zEYUWPlVLp$E-I_b#>`vIwAE&nz=fFC7w}Qrki+eijo3c3W%^nqyv)Ro$Eny!lu(}u zwXOz378AR`T4Yi0ze$`+_HMp!?L?~zarI}#q_!L}xg!@*9V7XHR~cez`*pN`(XK7n zwqOtEk&HTK*pvou(^h+i-x;EwD zm+AZCwMc9^Bj#wbLHA_iHlsx0z-8PSP{QD15REQYheOTh#qzOdm}kv2)w`8;rdZ z6?!Ee8m}PoGmP)QHc&V78U?*ssGgAHswN3eubqp5w|bADbv6%=A8`13mo0KSc~GmI8n_=(KxLDAGXB6HuD=4Xr!ndjK@8qBI0>(u7S;Er71xO zNbCVK`*d7^(tZN>OVKcuiAm0gd~FKZWFMIp4>hSh8B@T*&9W|XVX*@cf-ADG-qE%C zsa#^%C6@L}#mb=+sF^*u%j_0Q$Xgw$&AN?i9?mU;{lDu864;qC7deI-gV#sLmPKPPKoP`2~4gY4BHp6 tvB+p$vpurviQKv+O$}Fhv{Y2g80P=%EqRyPbsA_1gQu&X%Q~loCIAF9Firpf literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD>ZPvx?~n$@y?q0EIXU zJR*x37`Q%wFr(8NlNmrkmUKs7M+SzC{oH>NS%Lhb0G|-oprD|rsHo)Rzr#q^4zg|$F|-BlGo1NyLa#TxxLS?9ee)#`TKj<-UG?^@4vr){{Q>?|KGp=|Nq~G zi(3_FJ5x!JU+{m1r`rv@fV>P(7sn8e>%PYW#hMfZ7#y};Te|6xNSr1s*PFlVXPjr6 zxnGc>j9Gf)w3&CGYVcRzoHR95+{SaG`Q7soQz!2Z?M;;PzPvee-TO-(QJ1yNS-;5F xJUKSAt#Q|#2c}8c|K=XMC$aR(`b7*sm=sQM=ghH>7X;eL;OXk;vd$@?2>{fEq*4F? diff --git a/htdocs/theme/md/img/object_payment.png b/htdocs/theme/md/img/object_payment.png index 5691147d8ffc7e161001fe58d28bd306815f779a..96eaf71df1e2ec5c3450fc491c5cc8eb355a6759 100644 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mmUy~2hEy~BtGO}_YuSHs8XRGaI}oO=xq^8)fF*1vqsdgpzf!u+3-^81B< zR;S$U?Xcd;7`>?Y)sgNSAzz-HW{ME&@3JdVW32ur8r$iet=2Q6Sa(rr#=VYE_o$Dn z%vNoBdwa8{ZTC4@h8^PGRcU*EZ(&+yniO_$T}AOjALTyY8wJ{r4)(qJuP^a|`JAFf VtyP`R1fY8vJYD@<);T3K0RRH^TNVHS literal 339 zcmWkoF-Sr|0R7UCDC*K6LEsV=H7FDjMPwn5isA?_2NTkrJzD#uj-0+W zrIq8+WXLp4!!RgiLI}nfCb->hb1n#B5CcRIfDk}{5G1l&4$rnjAD!+ z(6mfO%V~sA&bdxBp+kbPP6@?Gir@{-07VIg6FSWa9q3dwc&@>bAt)m%XDX+f!Lj=m z?8|$WgG6jing4uB$&d{P14--Sk+^hP0`Aaz&Q}|#ZbbC$H*GQjm+KuI)Kby5tQ` z&Cjf}wl*|&PS_N+U{hz$Nd3C}99p+=1cBR2W48~dJA76_tYyvus!PC{xWt~$(69D!WM8p69 literal 577 zcmV-H0>1r;P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^=G z5-v5)pJ!kSDS+&{-L5pA`*kxuOD?yNLEQI|7OBBX11Avs$lNe)VtwoIS{{YUpDbgGZvVk$i zJR`ZI93+dPC_aqG<4zO|fJXqp9Fhd!#&9_Fod6`g&u^`PQc91jstVrwP8+<<+$rf- zN@=&Msw3|`LI|AzzDW8;5&(W1W6rF#otgo_gb;oJcn3fvhbg6l)oR6ye)tz1lW+fA z(jsecI2a6G0yy`&Iv8Ww9V^;)Jq6{SKu{ar*^BWKX2#8w|5oFR@Jb1+4OBbe#{04}wFZIqX&>Hq)$07*qoL9B(R+dvVGAlkVL}|sktlN2*ZqI@|9>4URoMWfq>MP@j0gFz zRj`Xh%>dLtcH<^9PJXKkGKu0!#VWDl#f_tTE8sw#l(gKb+51eJnJ5n~z}Abh8Bs;+ z*?iJI2l$k_4sd$J5{Wu2P_T~do^;_O0MXKi3h6~B?W9Rxpo0I}31cTl3)KfUo*>_F Tl%u%-0000CgPB(!7000SaNLh0L01EH`01EH{Laa2H00004XF*Lt006O%3;baP0003RP)t-s z000050|NyG0}BWR5ef$p4F?zz3K$d$9uo{IA`n3_8AvW1Pd_zRJ}p~GIay6ZVN5$- zP)2N4KzLv-b7ez*S1@;IPlRAHfn_~^Xh(W(T!Cvnjd4MVc2$XZRfl_Fhkap{Z8?d8 zca4B!l!98ClZL3Bkh6$IvW`yCzoEjjc*MAV%EFM($D6v6M!J-$+d6LyMoELZ_K-P&c1xmzk=J#pUl5@&cS@n z#eC4ng3`!{)y$3F)u!OstnKB`(943-%!t>~liSvx-r1(<a^L=e_Ca!|muEjw#tMKD*^GCDHc+T2h>T@=KXGqCXY zvo}+gotbxE>62#@vasdKodwY8^uvz@tzP|46?rz#b x5UcogLPJAzl(=CI;n($4I?WBY8bJd^9mpLWLulR7>2_;R?iH^jX8z_4o(6C1lq zghSJ!g{gO$yhH@I*89ZJ6T-G@y GGywnxLr*6QTc z>fzDuk-iJ71Zw&H0Tqz>S8t6B4Dvq%x0^w-A)0U!;1dt#N54xQ%`I@d9JYg}@Be9n}>^li==7sJYrL{=T} zuX$A5u)4BsV|B|e&z7rU-B%+g-j1GpD`v_a_m=nm{T~CmKE_XYk~!;c_RM!V3+`tv z{+_$!NACK+bt@lMuKm>1x4moXzP7pNdL|#3Fyr9lSx2YMJuz+m>6V4J+E?D6vf%jK z73U_byE|{$g~l}xTUI`3S^KDe?W30UUt2c3YTNavbLW?iJ%6UGe>8dTiz)lw&)xQP z(TcOn*56pN;mV55S9k9|yJYvH4Z9z;ANV`t;LllSe(yeTd*7k^3y!{CeEj{Y15cM< z_`Uqb(Sb8> z&Ruw`bn`y7~0y)i3{V{`mjo$=fII|Gs$f_3gXw@7{fR_4enp z-~Zlx|Nr5`&+p%VfBgOb@85s_|NjR@tE;QBFk{R?AZu<(kY6xRaL@vV(|`8(03ABp z)5S4_<9hOpW+n-RkaPzDA#;PpTa6{oY%Scd`K$h`d4?-*NF6C%uX8eYzKyA^>J^?N zTm5@=RiO>SVrDJI!sIl@qt>@>Jv+;7$WnAT?fg93;!`c_rahApR=93sZEdZsbm#o_QGZ{Qx{an^LB{Ts5chDL% diff --git a/htdocs/theme/md/img/object_projectpub.png b/htdocs/theme/md/img/object_projectpub.png index 1444573cf05c248eaad1c94fa6ad2cedcd7a78d8..76139922af1f9fb5ac1f63c43fc79e2d3bfe8cfe 100644 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mQaxQ9Ln;`P4=~)~vEpGlz|{8N z!9slY6urY~ZOjf8EGrhYFO>I?WBY8bJd^9mpLWLulR7>2_;R?iH^jX8z_4o(6C1lq zghSJ!g{gO$yhH@I*89ZJ6T-G@y GGywn!lvNA9*UJvjIaRrKVaq%&5NOSWD^YV-F z2}lSCii?WLGH@s|bE`3MX)$tZG4g6N^J=m1YAGt~DXSWY>iVf^Ir#)vv#NG*YjtvJ z_3&tS^6GT)>2&k!^$6(q3hMU>8uW=jr7}^)jD2ht6{eo$DCAH7>b5K4(f``Zni`i(%zQBC8Jg z*E}k2SY6q+vASiKXUo;F?yHd#Z%0qQ6*J|Id&_(O{*M7&ALA!H$((gJd*-{G1^2TS zf6ra=BX|AZx|I(r*M4g1+uk*GU)$VsJ(CYim~n9OtfSNBo|rcObj!k9?JMt3S#W&r zigOdz-JQ4WLgSi;Eh`_itbNqK_EF3FuPqy1we9-Tx${fMou)UCaAn2jtGjofU9$VphTV_a5B!~R@aL>Ezjq(Fz3&%;7XWs6(_-^CH54*2@*!uYI?kE5DKmBv$=+$%Q?;Jbz=)jpb z=dQjwd-KzU%P(%+cyjB`+cR%|-F*7<>X-jFfBb*)||Nq}mvhV;#?c9NtJbnUI(BB3-Nx;Ub@h$4jtHFKoo!qF?Tn`IuBchXJ`FLS-@JLVrlY_< jUfa7^K%Dc;OlF418$!KbZvLABbT5OatDnm{r-UW|n4cfS diff --git a/htdocs/theme/md/img/object_projecttask.png b/htdocs/theme/md/img/object_projecttask.png index 4a01b50435a54567ce0d53cad192e728aba5505a..c54e95f03ba60dd0dc30f7227c8cb70c0e7c43cd 100644 GIT binary patch literal 216 zcmV;}04M*6P)4nuVE}XsJ*QC{reOdR;s7SD0Jp$L{L>+hKxeH3@Oh0Fg##L&U;E~z*Al}- zN7OkGXoW?bGs=z(<%BpEgU_N~#vb(we1Z}tp;5(#HPzVYNesY@*YN1Vr|b07eC$cN zv32g~*r?^NSs54@uLt;qxB|twxcC@2q`7&7dHKco z1SA9m#YM$r88{S~xz!lBv>3Uy7yai2v}?tv)L+aw^P98u%iEdBcBD*&PSzO zjw^VbRtmXl9C6$t>X>ozb%V6~dYMn1L+81K&UK958kgK2pED&eeVcQ}#jx@tkyQu$ zYaSIhtgdX^SlzPAv*l`7_tnUWx1%TDikWi9z2&`s|Hpu?kMR?pWX`&qJ@Z}8g8NyE zzvnLbk-PqH-O7iRYdfT_mX!}$);{WA`>198*Om>h+IIcv-1((r&z~vlA5Gr-V#>bvbGJQR zwBqct^*5GmxUypN)!n<#F4_HP!|q4z2ma1D_;c2o-@6ao-goH!f}^h&AAi5_{kGjDfXe7Eu9huzmcY<>K9_mhA7pZ+;=^y<0ucaEKUbl}XJ zb5~!Tz4__F?^7hI5zb{^Vef#eFyLVq+z5V&@ z_rEva|9|-K^ZWPTAAkS<`}g1f|Nn0&S$F`Wc5X?KUoen6XaU3NKYM(D4&C7C;uykl zJ$Xhmlf<(#hC)I{uXs3`3YK#i8*SoF*;2;Vywj{Pr^o4#aGH;qC7deI-gV#sLmPKPPKoP`2~4gY4BHp6 tvB+p$vpurviQKv+O$}Fhv{Y2g80P=%EqRyPbsA_1gQu&X%Q~loCIAF9Firpf literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC(gJ)!T%)3*f`WqX0l~F%_s$(V zw|DKawR6s`opNqz&;S4bzrTO}{@%5gmX_z|_FmgM2gJX2>>P;keeKdY=e91rcWmqP z=g+rpU3+Zr-ebp(tzEnJ{rmSzmoA+$WlB#^&)%(Di;Ihslar^^$XftyWGo5t3ubV5 zb|VeQN%3@X4B@!$d;Bz0lY#*2g^yX+9?VtodgJ=)|NoS3CY#;LN(>AhY@xlUXKjl* z%AR>${Qk<7y#4CsR|Vd0ee!14r2`)MOO@GwX_{Mn%G!SC;>FpqMRy&Ht^eQNc6Z_X f{^jwrot|)q-(z*oKW`Waw2#5l)z4*}Q$iB}Jj;&> diff --git a/htdocs/theme/md/img/object_reduc.png b/htdocs/theme/md/img/object_reduc.png index ccfd2d2f5b2cc8a689ef175cbece501f8084084b..b59cbf36f3eeab619f6c875e1ee1a4eba26c3eca 100644 GIT binary patch literal 221 zcmV<303!d1P) zK`KR29LMpGr@-{=c=E}gc1nQce6)47DmrdxJ*$68zdK>srN=MFBul&Bl^Xc@r z?&f-@W;UIZPvx+nEuHMcj0uX?%lfe*xtRzjvYIp03V8*}>pCo^YWg|_K525hyQyhXKy>}46&cI5UZq}pxYl&J)vnXCN( diff --git a/htdocs/theme/md/img/object_resource.png b/htdocs/theme/md/img/object_resource.png index 8cda1f3f2202f020c2aa7f0438b72e06f559c83e..b35923a7e4ff612a9062fd6d52d18d8ceeea497e 100644 GIT binary patch literal 227 zcmV<90382`P)5Q- zODY8b06@`G^kM;|Y``Z2nK5RnOxOvw;#;gj*}|L3BK+rE89pB39R6&=mVNs+P58!| zTS;vL>4nJaD4z_MyE9? lK9WujUNMOxAp(mS8H6JFu1;5C6$k2M@O1TaS?83{1OOqAH4Oj& diff --git a/htdocs/theme/md/img/object_sending.png b/htdocs/theme/md/img/object_sending.png index c798ced0b5c113d90d6987b597b477a0face49fa..7a4a0a44f38d545f0a9a5b1379f7f95a244ce450 100644 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mN<3X0Ln;`P7nmocTb%eH&u!DN z<^-FDL%>Alom~P3jQbY}^KkK`@%T$_;fQ{Ix}dd@drb#JiGt@v^|q-z^Aito2+mMq zUhww4Bv<1%apsrI3LR=m3?Co*wCVEP;<+ukjPd3U7YP^1GUGofH%=-vxwiacV95M4 WiS^KuW%GgdGkCiCxvXt<7 z@9F88oSdAUon2g9TwNTre0uJbDN|OiT)B6O*SWPp=Z^L4+`04Ev18}XoqPWL`Fe*< zS3w4q1o;IsI6S+N2I3@nySp%Su*!M>Ih+L^k;M!QTpvJ~(P@pz44@!;iKnkC`)zJH zZejL@r#Xs1Azx1y#}JO|$q5P!F)=YBj$7{U-L5Y+;pKHp{T6$MmuIHRO8w*E*%xV? zp0VYH!H?9nvo8MsC*16I`_k)LHCG-zHC;75y*h_x8HpQrB^mNLrR`6Odba}&X7F_N Kb6Mw<&;$U{r(lu* diff --git a/htdocs/theme/md/img/object_service.png b/htdocs/theme/md/img/object_service.png index 65e9041589f39e0c76746ea08669baa778442a61..4f8ad8e43e2e6ffaaf1a0751713aa1e1128b046c 100644 GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mGCW-zLn;`PB{CN9w6HW7AC6Zj zIkbMo)Q9#0W)H&zP8G1OU|`ZWWJ%OYNSVPn)$M?$L!d|ix5$x}sVBTrBzopr0D>_yGXMYp literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCrUm$fxB_V>LkTZU2`@{->>#J& zWFQJE&i1MfGOSM4tj>0-&W>tHHf+hZY^hG}DR$~94(h26>S;;tX(^tPZMk;Nl&w8Z zTYJ3rPI1~h$7}DLpks5QjxCKkwl?|L*6d?jtIzE%KDW2}+%X`Ua&2qNwY^KPool&v zZOXlKbM9ROqNVrlEq(rc@B8QH-oHQh{r$b~-=F{g|6ff$?lsV5j3q&S!3+-1ZlnP@ zt)4E9Aso@Br(a7oDeyEr6m?Cv7El!kKE2`$&%6K6CMDkQx7}0C#$dW?`AbLHdA+y) zY}`@5d-mbnpl=^@gB4~e7lxO=m0oK%|JlUq*7fXhCG*z5yde=Cxp=D5x`GpWouO;q z%x2smBK|JQhoR!kZ-E&S&WkwggqvC$dpz}*KG6C5R$Z5|PD7E$GEmGT2k0OMPgg&e IbxsLQ08x~q)&Kwi diff --git a/htdocs/theme/md/img/object_stock.png b/htdocs/theme/md/img/object_stock.png index 2f439db7b500111372c4f8cba7e71e06e460b823..f6bcc6478aecbbafaeb3cac77dd47f4845c8d042 100644 GIT binary patch literal 91 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mlssJ=Ln;`PB{&ieJZNB+QV@|% o_|eZSr*Ki_)LQASeg7C3{@n_=m?xw77pR)S)78&qol`;+0KnxLqyPW_ literal 554 zcmWkqO=wd=5Z>CGI z1#4ji(e0se)k0UXq-*rBy~v}9`aF1eB}L+)8hbGD7gA6naWl-!H{Zt$GYphtp)Px$ z9RSc32?yc=yPMI`DzfYD$Ik-VCnM2d`)X_3F3+B$zqVcwQs+c?^dbQEpUr6TKXu;| zqV1e7>H{D>6V{mSA$T`DEXN)4K zA*fnRWr7gQkj${cuxweTuxhnhHW4Q(#|e|F22rr?!BD|S#ky=V4QrCgiOCU$NkcTy zq}g;uY(q#d3o|j&B&0f%38$v)uhnXn$t;6f93rUbinC;h{gOeF1Y@Wrpsq74YMo$2 zDWNDykwTFKp-wTRSY?!Q9O8@-7!nf(Nf2G)j1Z&}r2QK{{!aX%WilQ+2D}?3=~d^dqE@^3q12HssHYr4Nm|7 diff --git a/htdocs/theme/md/img/object_supplier_proposal.png b/htdocs/theme/md/img/object_supplier_proposal.png index 2dc60e66b3ec3d81f7a71167d00921dbb1bca75b..19d4be8371db14278febf70be41acb3963dd7d0f 100644 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mB0XIkLn;`P6;qC7deI-gV#sLmPKPPKoP`2~4gY4BHp6 tvB+p$vpurviQKv+O$}Fhv{Y2g80P=%EqRyPbsA_1gQu&X%Q~loCIAF9Firpf literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC(gJ)!T%)3*f`WqX0l~F%_s$(V zw|DKawR6s`opNqz&;S4bzrTO}{@%5gmX_z|_FmgM2gJX2>>P;keeKdY=e91rcWmqP z=g+rpU3+Zr-ebp(tzEnJ{rmSzmoA+$WlB#^&)%(Di;Ihslar^^$XftyWGo5t3ubV5 zb|VeQN%3@X4B@!$d;Bz0lY#*2g^yX+9?VtodgJ=)|NoS3CY#;LN(>AhY@xlUXKjl* z%AR>${Qk<7y#4CsR|Vd0ee!14r2`)MOO@GwX_{Mn%G!SC;>FpqMRy&Ht^eQNc6Z_X f{^jwrot|)q-(z*oKW`Waw2#5l)z4*}Q$iB}Jj;&> diff --git a/htdocs/theme/md/img/object_task.png b/htdocs/theme/md/img/object_task.png index 14dc14a9602dbabc7b0702b0db699610bbd68313..c54e95f03ba60dd0dc30f7227c8cb70c0e7c43cd 100644 GIT binary patch literal 216 zcmV;}04M*6P)4nuVE}XsJ*QC{reOdR;s7SD0Jp$L{L>+hKxeH3@Oh0Fg##L&U;E~z*Al}- zN7OkGXoW?bGs=z(<%BpEgU_N~#vb(we1Z}tp;5(#HPzVYNesY@*YN1Vr|b07eC$cN zv32g~*r?^t<7f9A{?AeokyHgo1o zV`F2WOl!f*CLqOF666=m;PC858j$1Z>Eal|aXqxpQHaG+fKgNR|NkeJx#jDl*%&=1 z9b2rt{Om){3*FqE{uN&GAqmB|#iD8sGyIljT5#O=baZb1y!c7~3-2X*Zd0jk(PvZ& TSaR_#&`<_XS3j3^P6vL>4nJaD4z_MyE9? lK9WujUNMOxAp(mS8H6JFu1;5C6$k2M@O1TaS?83{1OOqAH4Oj& diff --git a/htdocs/theme/md/img/object_technic.png b/htdocs/theme/md/img/object_technic.png index 6186d18da70caa5acaa255752415d8136edcdc98..4ae5d40a34072b9d1e5ee77ab16c99723101482c 100644 GIT binary patch literal 256 zcmV+b0ssDqP)}OkXDjKyNt~;g}PwQg&&4F zFc*IRp^$(Reaww@Quq?W(w_`e7>YInRF07B`Sj*alhV@IyT*>>S#;zPU?egVwKJ2P zSB604(yCQ9LC>^RE|fnH)&OcDJb?5H5Xd=SP`S=VJ+Nigp1V>3BdaVrRXaEPU7RP; zk$cIm#*15vTzE9ow?5w@V|XQ`^e@u@0000~|kR?MNMiPaA~<1&fT(45k-CkV*f&VThu-2XQXM(%4mWz@--t(5WD?%;ydD zp!s-7V_=jxE>)_y#2KYC<|Tb(O$8l`0uFU5KrdYwShSp`(&zS#gJigYMImSISvU4z zFrm>ydDaf-%lE6%AKH|7-_dV*tXgs{f?y_`pObaUn1lfb8_)qC6OB50%FCxBVM#yM z&`;Hy8ca_n{`e*PVV{U?yv>QrVfv61fdp;7D3RaNFJw&%ba$drB+fMO!8;*>vIvy9HS#rYVoAT zBvX?Boe2g)YD=BnP%l~`?-!$hj7s6-J)|B0_I ztz`5Fyu_k2w)yoU#TU=O8y}$9W5@+NGP)<=mO52xT;XHVrH#cB5q7wfGs+3qEHDqI XDYa}{2*b9c00000NkvXXu0mjfQ)yZw literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~dL^zACC){ui6xo&c?uz!xv30U zsik@fh9(M$Wkq@lMg|6^K*Gw@*vi02LEFI4z(6Oz_Zv_rdx@v7EBjRzK4D?Y-Jg_d zfI^%F9+AZi3|t>Tn9*sC$qb+%OS+@4BLl<6e(pbstU$g&fKQ04t*vcTR8(?ua&~rh zadB~Vb@hY^6BaC3uy*a*ty{P5-MjbLv18}Xox67J+Vkhn|NsAQqoUma)GJUDF!$v^lRd3I!oi;FV~yxsi#%g3seUuRZ5KJ)%y$?mE<^=$8r zt+!`S$zb}K-gkX&^^pY^r|n&P%%t<+QIjKAjvj4)=$~=se}3YBMxG@u?CTpI*aA&v N@O1TaS?83{1OPx4herSa diff --git a/htdocs/theme/md/img/object_user.png b/htdocs/theme/md/img/object_user.png index efd446a1a4c05b50932240855227fec33c4564c2..599e87b3ab83c621f919b124054165edfe13692a 100644 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mvOQfKLn;`zp4!NH$U(y4;d-N+ z4$H52wiu_eZ#?S~r7btj?P1OnhllMV&#K=VPj=JaeLK6Q>S?ghsnT73GxeNe=WcWA zojY46a>mV5#~$RESV^wYt<5ZTd%C=RNvQ191^j~U}XRR0n$lC zK~yNuos!LNQc)Cz*FNXMr3jQCsf`c^G;L>;nrb_<3>=v_QAZ9;9O)A{vro`x@B#V+ zJb*FLl%#e{q*hVtr5B{--g7wTY-bHNGI7t=&RW?!Dshau6^+J5+V}nE z!C(NbG*lep^xG*`R%)*RWab7hCzBL2drB!Nt)aDs)(Rv93i(29?yLQNKPExrTrQK< zTESTdV+}^55yD}3HuqxiD^S*$4^usbRvJ+hAqQa;YZ@Zfs;a#kp4(nQ0ujL)+s$QjN1pT&!5}yXz*hk5?mpNlm5OhZspK7N?QJ1M-dallAcO>%11aTM z6ssR6Urt`O+wHHiUav3QT3+5y`iaK?mH;d`=dOriW`K}p=CYTNH6l^%bUFv#Qn{Qa z!WIBH=l;nhGlRh(NAUf`GXU_W)<|Ovd)B)Em;ey-Uu`oH7=R-p$IN~qe>3w3L_pZo TS%?Lg00000NkvXXu0mjfQPcC^ diff --git a/htdocs/theme/md/img/off.png b/htdocs/theme/md/img/off.png index f4217646b2645e16a1c83ccedb6755a8932a1e38..9bab123aca7f214c66ac06f8a1635eed9d8ee9e9 100644 GIT binary patch literal 248 zcmVtP9`U%sl=ukMXKL^sa7h zE;^M5z1y1#k9xBb`7u4(@gCcop18|hMDS@P{Y^>ZAdXf*FQ63~Nm64i(j9OWYqG#X zjiphfXW(YaSWQO4!!xLrN{CB=EVXDdb^^LsHE}4qX(P1(s%YR~9h0Q>6)!L+KjDeD yvSyC|BH!M)$9iJ{jJ72LRCdk=gOiQ9*YpbvQLBz5<54^S0000}RC_ literal 568 zcmV-80>}M{P)4sdN=qp%#lNC1GzKrRLGcRWLXo&kFcqXEv8cEa#hq9|L}Jo9og|GRPSSQF ziI_Ac={RQ0WFoyt*X8YZ4l`w}iwC~*o%cC6j^k%ro5Mov?R}VVyM3oKGm^ZppyvYt zU7DTEQ7=GqkL_8zupiy#T`-X?|0HJf7ECcnjqjR z7K0jzKs`L6qlD#+Sq`emtmAHV3fF_csa$A|O^CFox(i1+nDn3{qxJq^+2LZeiI91io0DYlsSnGNWHAdZaS`cgr0 zbrr`Q9eCH?jy&C~QNKcba*}6E@tlb-ts}4%1)mQZ1?#yS>RAa5O@p|&2*K&JAN4g8 z9}z!TBRM#Tx82=%L$4gA`^Lf{>CXz#bF0+q{Bs(C8nW;#$0ys+x`!rX-%&py|#(o4PTh|78Q`MQoa*LCo gS+I9>u(R@P|HtH;y42vvYybcN07*qoM6N<$f*(s}5&!@I literal 603 zcmV-h0;K(kP)Db~;I~-!` z=vbmN_$Yl`p2?h$#}ZvDlylqSjk}DsM(NaeqFa8iP9j$GVRiEzCsuof59$;ql1DVE z>H9~t$D2>y{eI}TUz?x#zh{AZe4F-Auf7Q`(NX^mPHgr{rgsb;G_QDb6+U9OAUFf8mvUP)7TD=r8oSP8a8QC-JK>;N@v z)Baa!TS(x+p%MtxV#n|9Kp+;Es pdZWnLLrf4+La8GVQ^Y=F?H>#$+i6j^&6EHD002ovPDHLkV1h@)5;Xt- diff --git a/htdocs/theme/md/img/play.png b/htdocs/theme/md/img/play.png index 4922ea1ec12a8606851317be0927fa7c83132889..96021dc5081e1daa4d37cd649d720e676c27ecec 100644 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mygXeTLn;`PB|Hu|_bh7Xxz{54 zm;KOGo<}SqjSsEcQucH`D6ntV%5&xTF?V5Cc8BOlfbI$K#7JzXv8rz9tLeSw=&&{vy+ zAX{t$K@Lf#{_!}zfVLSPBSp#ZPhZe{kj5nrPIvhn+m1mpDd=0ET!`0}hHN9-z3X#w z7G!;n*58dhLbt*&%D&>7_*|D2$6uwuApkw_teg^^HRmB%(3CZP*Z^3b=Z)x~N@?91mxwIso5d08ZM#q761; zv*L^F@xCPOAIsVVlI8K+a>K(x=32s_H=z>kh!NOF2>|&AZ#Eg}zwVfHZV-UjG5t*- z_-Vj!K7Gu;^<}aT`IdgnW%NZH$kh&j+YbPN?|i17hyxjci8FB4suneh?D7_ORLJz|u8)DF z5@@$wlblat=pcG+DQVX)_j5;q;(O4!4jEff`2h4cG|qFMDO z;$#V%o0C_XK$y|w4U_isuuJkSa1s(#oO1TimOj2y9i7v5G5Sd`EYeZ6Ew#P#2WSX` Mr>mdKI;Vst0E-eK>;M1& literal 620 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~e!3-p0EYEHRQo1Fs5hcz=sfi_-`FRQNn{1`&jeIMY#?g!0;1v`uj(m5*~LNCbAnocXlYb-brg{7SsOKFYjV%h zFH_dnbWfNSj*OP zJyYiNEZy3(_u7=L$L7pgI%n1dd(1cMb@yT|0O0`MG=V z&pm&C?fLU-&)?qzg6AOc9tgfe!2j?6LEzMvl@dU&xt0X^1%m}BBp5cm+h_qaaGIx! zV+e<=?7^FSO$H(k2fGDUdQZ(#?iCYXF1duZYUWi+a}@hziVa*_lxMtRV9?vzkUNEc`U)VEfx*+&&t;ucLK6UF CkujwJ delta 313 zcmZ3^c#>&?WIY=L14G!kzHlJLSRCZ;#IWw1%u67LEy>&6h2cL4F4((#GEjuGz$3Dl zfq`2Xgc%uT&5-~KvX^-Jy0YJAl@pNA>=xxX3=}%)>Eak-ar*3}-Moh!1YG9ps)sO2 z9=XgA>X5VC<4ObPiUt|W#k|o^q8S@sHq~=XmMGcu?$1Py8!t?5&AdA^`p5RJT@6b_ zJlHE*XNu}gsF)>opvqyz8>Wxz*Zefosu8vhtu~${!kn(aoTfazf=N6fKW%;gR^1J= z6^hu`>83wU+cHPuB(KHR_fxe+d__*(TD$MglI1@o4)7<}^D-EpuHCUDZlTnQIn8tU zBdRUbjRJ&c%<#@~;+iDo`7wJ?4sjygS@*6UV$`p=OU}W|`P`E>nNbW^*u1E}vst(w2g3%gran6&F1} sp;E6RlKqGGbkhXYo-;l?CVRdzXLGLK=BO9b1auRFr>mdKI;Vst0EEX)`Tzg` literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~e!3-p0EYEHRQs)DFLR<~Kq6~wQErX&ggR(87 zvMrN~or02`fMjyDQ#KH_cmYvyk5~1SpzPwH>N!CzK(sU}yE+O;_NzuvkmhQc_^w_<%$Iflt3j)Wk-8%;a*RGwr_x#+w_vfC! zzxMq3wde2e0l{++cn<{MA>jY_{~&Pc%Ss8L*IY}2{DQ#(6cP-Z-fgr18aUb0#W92< zn)P5bS5tsU+r{;d1NWpvIx2j55;5yPgOtNwk=CHDH~-&UyA{LuciPN7uNagJe3hSV zdREhvlTfwf*xkwJ&nI~|lxt}+UdUB3=+)6-NXTdEzHPPcnZ*)u!SJ*PlTOPjwQ@VG z+j2?ZMVZ>kNi!=qsyqFk%c#2fLU;;uWpvGwlr7Vf-C17!Dww`$**fnZ%ym*B!7NOT Rj6mlxc)I$ztaD0e0st>n9KQen diff --git a/htdocs/theme/md/img/recent.png b/htdocs/theme/md/img/recent.png index a49fc171c06d79261f00cc16118595d22077b29b..e6fb611f3bce650dd1c8b36e190277d573c63c87 100644 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|may(reLn;`P6~r`*uNa#oIH-%5 zI;j5Nc%XJgm(&I=D~C0USQhAdwTQ?vTq-@Hk+qO?LSsr8V@e@oQZZv%N@H45gkvFuV=0VlF^qd-jC*U8glnywd##*=wQ~Tya{#@2 z0KIz%y?YS7rF*@lgvNUS#)JUIgb2=r0M3L6&Ws4olqt@XG1i0t){Fqwj0o10A>NDt z-joR5ln~yW0N$J--lam`ty1Td0Oy<#=bRYlr77pFLg%$w=f-pIoEYz=81JPa@2x5C zwLM){Otwl>gqG|K6ql-mU-VwQC`%hyVZp0d!JM zQvg8b*k%9#0HjGoK~xCWO^(S9fNs|f~on?Yq5#NdKxf=fV=Ek^wRkMaN#>sIgZ zssLsHkm$n90zxVPz5)Q#Dm|(9dxxFh0Epu&C8B*8G#yIjrAAuybX&mQwKm9jr^+?~ z%x_g$e8x1YifAR6!Mr}@^~{)7SrW$q0Knd6%gLfVJFNr$<3dFD#Nl>j6Iw*%L_rIr pw8dbkGjCk({;L20i$C!5;R}*T4|EuOrfvWL002ovPDHLkV1g_I%Z&g4 diff --git a/htdocs/theme/md/img/refresh.png b/htdocs/theme/md/img/refresh.png index 9994475cdfe0fb8c646eb1877a84443066a73d93..a4fac077e7aa050f4a84419d6d3df6af9af4d16d 100644 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mrg*wIhEy;fJ!7wTyg;VmVfw;# z3XjYVH8e}Kd|^AApH(;6IMmbY==^!jM;xqceSE*Jp1kz@pJ!X=+3pO>|DZB`;RK5- zoKu5Viru@@@#Ruwc}hu^K;{(g;6rYIdZVU#Do$GzmwC{Bk^A?Gw(Lap^d8T>-j}!PC{xWt~$( F695yoR&f9T literal 722 zcmV;@0xkWCP)YH zKm%ON42;6;44maEEON_y_)3;}a?MFlVvu6M2S6HfG??{Q1@TrKZ_qjae0RaWBQ;JJ z3v{?_RJj@Wd6{r%^pjyw+!)2X_{kcRZ-39Z|NnbB?%&Jx$=}a5yPjL)FIN>K$D+u~ z!oY~3QJs&0x5JJ-`a-wjxgUqk|NPly@&Elw+y6h-2K|3JHSq1GaD{$%ekMs)kYXMd z2IfR%2I&N429-E@22od02JS9PR==~&ve(|O()+q2mS_8w3h67~X4(C}*I@N#vMG0z z01E>vgD5AX=+;D%AB z^#AV(5m+h8!63*W!ObXlp+fP?>+Pw(weOTlLQ|~a4||Th;uPWpUIVY_-S?E-#wW+^DRXfB>7kwm_^tb1O-?bz~N}X z!@#`EovY$ii^A8NSt4I0ftE3da4-n$4Ch|*ZNB~g>+ROJVzfEJYxNm)SNn@Bm|)Is zDb3EnVj;l5zQUEg@O-Aom4gvHr^LA!B^iW(9-VK@5`M2v>CKk~ZvRi0=$%^QFEahk zoRp8p>)g(^8gsh<1B@eHfk81@jlm{Sjlmcgpll2rK&M3TGe~U>;+p!RP2=O&S&sjo zOmzMEV^iM0uN%{TpQ>>@)?&>csLBiRI|=|sDpP_oqxu$qj?SxvlK0+q>;3*a-R$4L zX}bU4PImaUJzjCEuPlQO)>Oj>Oc5IV45G!lOfH9G_)dOoRrq^7TlnpcVD5#pj5xfV z*%|oprq@VW2JYo9EXy|du+8r_W3&MU9xxnO*wNGh0HJEuBo)&9!2kdN07*qoM6N<$ Eg5ua`M*si- diff --git a/htdocs/theme/md/img/reload.png b/htdocs/theme/md/img/reload.png index a4029f119def5d9ca4c5f7f1bc6a452176bf5b06..a4fac077e7aa050f4a84419d6d3df6af9af4d16d 100644 GIT binary patch delta 188 zcmV;t07L)41 z^ajmuYJQV5RY^+4pPqxnKs$X*P4%mjrO*84wVpk>R&Vemm!Xh2)CrYRsTSVci1gBV zcVu*G5NVVPQ^H34jarpSA(oX>V4y5N$e2{G6k^_+1%BMO-*2b|;o^^|?8?hdl^qD(~U7?6ySOppu+gG7)!Q4hvMSYQj|No=(Kykg?MTQ)Jvq%YX^x9` z<~II3e3`G%>{>ifvstipIJmpH^0&q~lxANZzwr5ye<^4kE@;2R-G0>>G;ihPIQy!4 zPOU`7?hhi(v26Y5#Cl)v*noY9_R!V0D-$zQvwQt=_^YF8PlvI>ZY}jIQu5~uf4Ht} zo_Tsr-L__EPhx)dj^+;R&tEea_v^b=+0TwYzo$4q)c;r;XZ_XkX7U7UEu8!?m_9wd z{6H*CU+OGAZOUu}6KV@OW+p0jvG&nNMkN1_h$2?WzL2%Ns p4~-LqB-{EER9PGt12}sb7~Wsjbd`5e^8{MJ;OXk;vd$@?2>>brE9C$H literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^@!2%?Ibh-orsbo(V#}J9j$v@6FNE-=ENLi8C zk$QkhVbXMoXOE`YoHJ;x@Z@DHZh6Al7ANAF+Gft9W^i&cPrqcC!oggJgYi6$0-nKb z3~d}L5j-M$&L(h7bYZvRF_%1&aBLB?C0po@<^pF1&hnrWfyK`z1Fd85boFyt=akR{ E0E*BsG5`Po diff --git a/htdocs/theme/md/img/searchclear.png b/htdocs/theme/md/img/searchclear.png index 12437f848238b68f5e1b716b5f56a7a5fe076df1..5715b64beed38049a6f48d0aed63fc5016d46290 100644 GIT binary patch delta 114 zcmV-&0FD3T0*?WZBx_blL_t(|0b>{_z>g_{DR7ga2Sucx;RdF%UWWfb3|9i=bz`%z z4=B-xR|#CQAE5+~GKdn&6hSTO0g^pPWPV{NF``+EN zyW}OkXDjKyNt~;g}PwQg&&4F zFc*IRp^$(Reaww@Quq?W(w_`e7>YInRF07B`Sj*alhV@IyT*>>S#;zPU?egVwKJ2P zSB604(yCQ9LC>^RE|fnH)&OcDJb?5H5Xd=SP`S=VJ+Nigp1V>3BdaVrRXaEPU7RP; zk$cIm#*15vTzE9ow?5w@V|XQ`^e@u@0000L`hzKc=0lo$X z24&~ZpT7un9)=-dVPUD)uV4REQ&Y7WsMZ*!IXpZ(2WWUQT%oqMcG>CEr!PiFN23@L z92}f?_3G9CAnfdH4|0Jq(6C8B?|kz1_Rd7H4P?lnLx(N`Z775KkI~oHxA4M+3;%&( z05+tuvT`%XJ3DslIBITg9)jU#O-;?RJ$v?Cw6(P@v$nPl^6>B|J%0T7e~=;9u3q_n z<;tZmt5>f+VPRoWBQ7p3hBewihAf=Ze|=i3!{x&}=Kj~!)otYDCmzP)P<`upF^OJO+AKB9J zZGOMwMj$RBXn>NEQn0^&;G~NeuY%&d$Ja%(u&3JM%#|ba{?G2V-!iMqt_-IE5)u+2 z{{Eq}u3fwH9~f{`_Soj^JZh>d_)6Nu%2SQv=;fLH*CC4pE4i1p%v k)TUHs8=eVtRRqTh02?mmtpET3 diff --git a/htdocs/theme/md/img/split.png b/htdocs/theme/md/img/split.png index bb66213f41332ebfae7172ce9e949bd2a4c60dda..f3c34618c6b568c56ce9815285bd517bf5398445 100644 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|m5^z;qsxwY>VXEO!{IqV)<+eKdZ`c=Ne10X$ul@a=5RdoW!O}8aGDbH3fI35CpjIg z<}74>WwvI4_=+_%H`x0d%P6dQaX=uzrJjMobF${v-USmXfOau>y85}Sb4q9e0Jp?2 AX#fBK literal 195 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4%JB>7u;-UBK25>H=O_M04RBHX%xziK^zLYxI2 zk;M!QTpvJ~(P@pz44@!Ox}&cn1H;CC?mvmFAVmQ_A+BrJu6_Uh{r~^}ojRP>0tJ~% zg8YL2|7W;zopr06x4mw*UYD diff --git a/htdocs/theme/md/img/star.png b/htdocs/theme/md/img/star.png index 4b6b458467588e6c444e1d4e23a00622db915374..d6496ab6f892098f74795a9a7f6628f8ce88bcdf 100644 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|m$~;{hLn;`P7brepa%xhTp*Uf~ zqNP0DoSKQrKTdp@*C@JQDZlN%!;8LHqppX{0Yaj63|)&DE8Cnky!Z@GBpUa2CThi; zbWz}EchH#C;LWLg*m%JguC}QTp9Ckgi$)mNqyD@+t3}brZ;8Ngt{%0%GOUy+%!FG z)6B4q^V7F3j^4STa{H3Z{R^u1&F|T}aO$2_IR{siA6(J6e@)@xRnzxxs6M&2bI+EX zLu(i8-(0wVN8yRhv-a;PJhyGixgB$^9a(q#^v+wS58XX`{O!Y=AD-Xqm6((Ra$-r4 zUoeBivm0q3PLj8~3quF1tOt<8S>O>_%)r3)0fZTy)|kuy3bL1Y`ns~;U||zB(ovrE z!WAeK@9E+g!g1ZT`?-*VfdHHTdsUbI7rGVyuOF67u77*3oc+UwbswBB-{(KqfBt-y zghp7f(KY|z`7Z0&4a9YYQqFH{`Pdt~-(E^lWlH>gle;FesmCQmy*WZ(8Px1K$J@Yt XH;ZjqbP0l+XkK(n6rf diff --git a/htdocs/theme/md/img/switch_off.png b/htdocs/theme/md/img/switch_off.png index 28a4376fb438b41bee3481e229439c14b55f8e1a..ad7e703ccac95afb2a7078f244ab47c1a47c26ac 100644 GIT binary patch literal 292 zcmV+<0o(qGP)#Gfo8X^ce{;17Zbf)+OJLzf^vn-qy~ zi$S!Ah2JZN`#5u-e{E4$*_2j&xD2+b>%zd9T*;5>Qm}nv6LGxh@V$x`lVB|kO+BN4 zH|7D#p2Xj-lx1qj1#>S0P6hEO1=}@5U)(x`s!uU$*b&?8scDH@@0O@aV$`$}-|Kj^ zU7%$+5~Ci51=})KJV(hxj3YT}wxwVP#_nVQ3vLC|*V6VJ+h#S*p=d_OYrx_J`&DMc qiE{(T>T)UAl-4C(Q(IH<*S-MD1!<<5j6Na&0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipiA z5jqg5-Ax_<00d-7L_t(Y$F-JCY*bYg$A9PE``*lSI@phCr?iNC#nK9t1x5maQdb1y zPNNWGL|7T43wOo^LBq}%)-KqaxX>84D4M8P1tqo;k+cfb3PtS4y!&R}eb>cI%k%>R ziYIx=z4x7S?)jf{?m0*H?j1Z>EEZp@R;%42;%Ff6J@-QQ!sorgz@`G~gS)h5JNAX2&j%A2&Tc-N$zB-1(?;?vBPZo{PZzRzw>9d2X}K zFQj2FSZf&?8ltmQ+A=dejrSfAS#npS{GFX9BINUV6gp$Ny1J^xVmsDaKo*pGp8|r% z*G-YTD4z$gn8*9uphX~xEG|u%o14Qg_UgZid>qG!NN8GHTjNrxgtc~=LZuWYFoV;|?bK%DeOioR)dUZG3whj;&$1fLuWoqgsE=_PQW!dgmqMCyR)7IXWbgk~DTrN|8 zE||bzqghV9e~Pko^lskB58n-Q{g0a*K5~#xKKhtzlYi6Oy8&x0`Q`${U!7-ce3HK2 zjYM%wn90-C(^F4Nk5WSRRukp9GRBzu_WVi|7=wty#m`t zb8~*N{odEpM?E+Y^KU|H?O5S)ZQrqjGpE1ch@yzpIVzRvGQCPYxJU#hs8vv{b+S@@Xv!CO^^Mp0?DT1_ zT$^Cm;FApQ8$^q+duSh-LMw4JhfBbxFt~3IL2eb+TAZtOT%V@P^oj^!7%r@rw#UX6 zdDnCAF(#N#PqWZ?8d;OXk-XhnOBXr??M}qoDGB2l;BCf=d85{fU%^=9eK^WxlDgPIV zK$@hCjQ%X;$VyW-D{1O$lMNsZ1E6mh00n&;fuwbw+IVDbB^ntSJ@yZNhzfv5NXKCS O0000ab@L=}R{sjSaF<8R^pwoJXBu(WYC><9Z4t&++3!^cp$v z)7~Bxf-TFKRVGUFnB3ct(Q)KWo%!m}KNR*{xNe-Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipiA z5j!x8s9cu-00c})L_t(Y$E}u2Y*j@V$A8~9bI!T1UP@bP3K$|u1I8#+gAWLMOmLwq z7sjm%Ltuk=MN#;NQ|M&RM$oTm9@SZ(;j-_dOPmD1a5jHXmaO&gaFBe8WoP7DAR{E!U zNn#BDf+yY0%irZSR?Tm@&4>gq?Y^t~ho5{=CMG6MjEs!D)ND2}Gd383IwBA5llK)q7RGBU}!5nj{!8u0=VN)6DszJr!)09$HCMD~s38SFRmTV{2=B9bT zKf`1DpGL*=&Gg4iwBBN{KFra9SGhQUhRg00JL_ZY8+w+r@dQ@5wRj=~0iPx2%?wq= zIrl#ZF(iWbj#8yU8q35UArg&xI>;{nC`U$*bH4E&tvJV#2cIXKgrD7M#zqe^I(vXO zubiiEsLsBTgPi@*C{--fz``Sx{6l`8eh5Eg~6TPNAO z{V2usB6-oGuU4b20cU>Ic|uerq)A7f_lk-8N8i4qgeVA#7e|sN_?WK4R19ZAL;m2d z)&b7ncpuXS_gBYQ8oW;K7s#~6Y;l#zeT+5@OgjNk)ti`|(lT@6nW5yp%XM{|u+fUlYm-6gTJ`g`~-B**>^3A&Umae>BR=>r1 z-9;75u$VOb)YR0whz<`843t9*VWSxl6%%tdId!2nQ~PyCy5Q41mx!3$vX`(fKf}5# qWexkD7wP%~BZA~hX+F@}G5$9kaK7(InJlgV0000t<7fA{l!!<`NxM-vaf zKCZCYPIPVpMHPtzd2*+!!@S6 zU1LsU9)EM@^xN|d*84UC&15VI@(X5gcy=QV$no@aaSY+OUVH8$SAzmi>%+jG=YvGF zKK{MGMLJRV(B0ZM1r|!(uP2MFmp#vO@yZ8(*_0Ze_gie7VgxprH(&u6{1-oD!M|k0wldT1B8LpLQfaRkP61P7yP*n83?#PoL;C~ z;V!!Vq2ZEk|MvGjIK;d%5(`gpqHbm{W!dC#PKk~Fjya(=g)VDR@~ z%r70GzL=S%2Il-B#$WxX38iWsdLAaXY^hGL(3dx|XBH+Zd09w5^ZlF76=pL<$S+>P z#)n}V@6!HTzh=}Pxe(OZv#^WBP1Ahy=AMOSa%`tMJTulko*ez+$H(cX_cD~r_uq;( SuT}s$mci52&t;ucLK6TQ?Ny%u literal 1019 zcmV~%$C<6;jC*(UELiMva2WGyKKR&sul;@R`@GNd9u_le z^3{tQFQ>yrcnLpX1T~z&Xufa4ga3!)Yw!jdIA3u((zMUz%-2|PDI6D=gZI&ovlnrv zfp(1JacrFqfHvHWl{hhldt(9rop4t#=b7%l`bp8i7bmlX@UI#G#oZ=O7t6(C;egMVnMXyQ`8D{;-Mr@ zZ#v?^=u~Q1$HF+iI_>-QrX+nTXC`B#%z>>*#61PB#Itw>O9G_q18o%m6PbwHu_d6- zhN<1@2X{x7MU}fHz*?l<-*R`N*eiJI}rUW@J_dD}^G;*ED%TKM^lPBxfEltCy pF@<4MRP5KM@VYm%X4d6h{{YFF2Y)`Zb-e%p002ovPDHLkV1k_?*0lft diff --git a/htdocs/theme/md/img/title_bank.png b/htdocs/theme/md/img/title_bank.png index 034a8d0c5e4a4264c8d3dc0b9185eff071087d54..7ff265a49172eff0f2b0ede94ab364bbabe33cf2 100644 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8Lpd`}n0kP61+1@ZwY9LWibt_X0p zt>oD+@y|FWl|$vefMZ)(+j^e=4?n0h8^3HTFb*-?!=B~VUM+d1!@Q+evHc-yjJ8_L z`31f=1k~Cp+I~A6{qZoq&GmrB0cNJg#$WS2eoRi}GSJ$)LO~>` zSTRnH_s`rrZk{WjhjXvZpF3{+;Bd}&&UfDT{hs%EpZDYbxW{9xczzHE@bHLzw(vc! zR6k7OBDy2KF5|_%(}^O0C3Mivd_MC>DoCw%wBxHbfOa6dh?AJZYdBH_wiW^O>H_HJ zr-gTMChva4G@b~AYr%ouFa+B8z4Fr~Y{%j#Q_%m|#5;k#i)XP1|E&=h+QSg&1fu=; z8h>II*K5kRk$V^8G1^;g0DTU?c>=KBXQ{BQh< zj}pM^*isRwp*qm1>3Y4u`AhNcIXqeHvaf{S;a~ieb#K;eXlOgGLtqU13ZpalBXz$! zRd5OC@B$vf`8>C3^q{p|4#3vzdLgCvaoD~&2bL>AV+yav>2%gFEw>vEQo@-K?{u1! z)c-3umH*BKkvEFYx}x*Ipgz!VOq;^)PIlSJ_sJNaUuicS6m{7NXLGQ;j16(TC#UHh zNlSB7-B1Djwis&Q>D-qhwN`_`S{*)Dd?ahFLjbi1bW_h8M;yRnxyiAb&bJ<;cb8+^ a`i)y$|1F5x*>~^&0000|k0wldT1B8K8xu=U`NCo5DiH2NGjy$Z(Z+myB z3$9<{{(*0HHs`&R@FSo8bA-7C%}7vATULG4q`!WNBF~qj+D^(n3;O079Om^s^dh+a z=fnwrH5U9|yufq!|G+z)j-SI;IEk*h5bm69wK-wO66bWD>US&8^vdSvSQc?rB^*93 a!Y_C3)E>@?NO7PO7(8A5T-G@yGywp_)j`+* literal 828 zcmV-C1H=4@P)5QK z55EOJFron!D+*qP{sDSYM8Si9gGWz7k9yIg2Ty`06+KkMgHSyw3W|u@q>)&Q)g*1Q z+3d#4voH*sW|M3NhHPeM=6&XU-hJM896E0Uz**ojkOh{3x4?7Y9nheUZ8vZiXtwAN zfn)tLJ`B8+p?Ztn1bzT#`T^j!43vS2)m_UIxwxA;G3QMHAAk)J@h}L?0#9}N6i^b- z_w6=b7ZboJ;OnHO@lU`tzyr<$SAdP0KdfMFBmp1~yipLQ1!fkQ0d4}9fI!AV8Ww?5 zz+4glT;PTxJPj0pD)0o@t4}eiZB2>-fRn&=8BYNjU_^XJHBX*M48R<43m8}M2J%9y zRt6T51TZhfI}}sx^1#P-lTsaOK>;{t1e_ny17JnEkxLrD0!j+cRF8gKRkKn6IV09+5;2Oemznm)bhxSMrK!4Pm2*rv7jfJeY* zfyu}#S>UlKNz?=TffEX{stf{50!K6!(sH369=HgM8JzD?g4!pcs_N9fsCcF4L_Dwy zI1a4JxF>^)(g@cI#zEk8k`zqKpjm);(uQ9;x%tik4l6c#R>C3iy=sjIz&FwIQ}dce zt+7L%oA1>FQ{vJt!AknA0Y!@f7uX^IJyVdC^m<13f$w@B3XnagrgWX|g@Wx0C^uql zUe8s9kQbWv&|l zgNFNq2mpVL|0VU!RuT$D$%#r%aXiq_=>scx3)WagUPxPpg0%{mb^yZS!qc<)ji=<= zC1bCqaYHii9rbQ=K>+*{1!>U{79WnXV)%Yag5(%Kn%#98T8&0000|k0wldT1B8K8q^FBxNCo5DDTZ7OjvUPIU;ewp zs;%AGR^V&Yd(=pv_3r}A!loejTe^V+py>rvmy4w|>ZPB+DG3u6gc{pIJb uH~)gPg+e}Gtuc*R^4E>SWRXI_0h`#_-_l&QvUUJ1VeoYIb6Mw<&;$UsGBn=+ literal 562 zcmV-20?qx2P)kdTAqA_3pSHxTq8JbU#j_z)gM@Z`ae90M+bIV?iVac6XYFO4k2blWrA zv$KaS=*vuX^*`TKSIx9ZViN5Y6KWGH>~-pZX4U~ZHKukYb)Vy;&M`CV0v~Ej{SR~` z-8UsH8)5nnNoS3`N+1J%0s8@;1K?B1^+97f=7ilzIuB62bAClrlfrV~;RT-u=Qmbj zeb1sr@%=W4t(w_!z-P4$Vi_wpNrwetb7uBAFlVj`vE7=4*39f&($66p?_G6&iCUDfKJeSMlQLTbwmkO+g*ZLn zG$3lr#fwV*9JrEn;@L^-z<19=D#ZCK={T?}KLT&75PJ+f<-k*|%ZSyj{9a-qVG1m$ zM7^?Nu%{ zDRrDFu~CTmO2LgAMcecc%g06RTGB;H_5Rv+jy*9^rM6a~E##n~qLkip2=r8H4@E?JQFT^iU`W zf)t7;F;~-`+LC}sJhZiFV-+-LQ7kQuHO)4e!7ZrcuT2wJ^F7Z{q71EskUDG`tN53x@B;^M#BmZnVSj>o|@d zW8@cng6+7BnZl@|r&WeG<0O7V8CUQgHWl_<#AKM5#L>dqD>#MsS7LNMUd2~(2De_?-3d8vuv9=wfr@nH-PW{l>V9l}T06IQx0g70xH zAP=J-^O#CV=9>ZNj^Y8lm2aQp8~lnla02_13)L`F&KSf2e1=|h;9)_3H3`}fKo33$ z?K6qx5aw_u_qtYG9u>}QNPK$}icb7nNB@!l{=qo5WOF6dozMD0fGw6T^ku!$B(zJ0 zU>bL@H_9I8&{Ps~wX!4wlEvkCHJd}T#e=Jqh79!KHH;+`-E9C+mw}h?X%c80-vz*8 z2Ikwvz+AF+Dsvb9300000NkvXXu0mjf7}0P` diff --git a/htdocs/theme/md/img/title_home.png b/htdocs/theme/md/img/title_home.png index e9273e727f59a5eefc3516fac772d8326f64804a..b832916f5e97b28900f42852d245eead209cdb4e 100644 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;tEY=&NCjiE0%H#odmG!D3ylpr zRt#MKj&n(KobHoyi730G@JiK#so@_R@5?=H_dhxtYH57Gm9b3LwBui8Z-dUo1Q7;? Y)Ib!+Ka<;CPgn5}e}RaWi&l0vf^y)2{xgb-D5wb5Vk?N1wT;?%orsNC zSZE`NHdd#ctB03lld<^*h9#NIY@!2?Fq^k;-h98`_a+1VkEIxA<9W9SI13b-C%|)$ z{{%P(90%S3Pk~vNot#vFEm_v!cLaD0dfl>&#;@bgiFF@xAxDI>(zJ%878DJI21%FpN02~I^ozkwQ zU^j40Jdb;BQX}A*E6jNW)>P9IHJ+kp%Yb7_9AR~O_sc4WY9;MG7dKLC!Z zcK^rN37iJr3{(jRg~UjrOaH;539zhn-UBazS)B+k0GE1B!T_IuTWa0jK46@Fp0orm zo!$9-j5_Bqq!CqW&4EqNk!pYyRnm90?mF04^vvsgni8nszYlzFXjntwp2T~jhO!da z2i%qD^3cPmR4^kX3b%939agE+uCs=6%d~-D1ZGaKGN7K*fD<**)5ah`1F!A~DcQ`? zKrjWFCYb;Jil%M*rUq(13}dpit1ZPij|S zJ_=ID*Ty!Yu6GOTR8$lKS;VCx3D5vB8mM6FbgOAVASi(!a*myI+-M9yddcBrciKq^#K){m8??`^mAA!vUf&EtRngrk1|3i zx+@YJ68VPJ_Qf}C1V?k2 zfnGVChFTNf_DT(E+!Zr=M!&Qa)HEU97SP+fh@r|^AsyA=M+|*52#jz=J7iI(lBmmB zKZiOwrKc7P;>oBeK%I-uo-9RGd7kx2HB&A%FU8ldD*o#`p;FPh5}4Ffi>EP@O#Lxc p(RwB_P%Yz+Rgz0VP1jxe@DH)rPatVkSDpX>002ovPDHLkV1g$@#dH7w literal 1028 zcmV+f1pE7mP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2j2!1 z7C8iN#ivsM00V?cL_t(o!|j+$PZLoXhM$>&(gFg4fEP4)A)+Lj8ob1~FuHK*MiX}? z#$Vun@IUw;bYQa}wY=k&9o^LnM2Xq6wfV94`4QK%7ff3;2Rsr7#+yE{Cdw~qlBu(iX4&VX> z;3x0{cmzBIW;X+T7jPc90-OPcL?n**z+2!c@C10QUD*&x1GfdhU#GqY?f@5nmW=>^ zTq|Y+DM{_$?C}y%w8mZo*MRMDL8Ph#p8`68exThlLq}ko3g+or<2}GdzyqGe0ntz; z_#AK#xDV_E_K3uFAS-8W)cg*x3ao{gg=4I|qXlV;3!+-^YrwQLm?xtUco^sqnKs}o z@CKLwE{klSjn=Mw0P;zL4@>WWOSAkPy z#&;;W1=1dOVmD#nO>#i5%sVCd1VHoutbCH-9hptu02e09a@Y=K;KD}Rd^rL^Traos zbJa{92YlLi&rU!^IjbM>-)7^TnoAt;gTO(N$O}wSWAnflU_8Pk_scB)Y!>)o;1)0- z+bzif8-Xd{0dO~B?xQNcW|IIP$6;RppB0nWwCb*|-DSd{qj9f{StY*muYfV&L`Yfd zsLn}gN7_Vi(J(JRsb~CcSgqNrqLU z^oJxE$1pEM$df-6L@p1^$eg~Zhs^=Mjj&sD@JD3pL%;#6%kd-bqx`0%n7^d!f^=SF zCXEuiYVavJ=zx+_pPC3K0;F$^MLiQjwkZFZ)v3aab|VM;s#K)ety+tYFHQo-B0fk6 zD8ItHmB!59ipneFBCrw^ciC*#8yy|>!s2`@a9U9!9TMLBm_XL^ZgAf#MLRJqU&(2Q z{sEs=L@8RpYYnj6Z__fPjFR1|d?F{)@}e^An4&|_TiT~xDP5B!<0-sO8PRObP(RA% zUA1Hxqw9B#vEbR&c!NPQcupB4UE_bYZ`kKLK`F7Ma5|afai41(ZP?dT1Q9}j7Yz;C y#T7*vFDdYG=Z!je3UkuL3b?w|r7m?@pZo=NH7Uu*yF-lt0000|k0wldT1B8K;k*AAeNCjguLt~%;myCqei3UE2 xXAG?WCo@WCqzOEYJIu0pqnT7TjNo!(WLRe8?4Thc6$sSL;OXk;vd$@?2>^ks8BYKJ literal 678 zcmV;X0$KfuP)n@Upx{p+iirP!XlT-;rl+8y4HcqDi-h<{LZsu?-u2SVMkDL& zvo|YcBulq@_V}Im9nW|x@@xgDD6SGT?bwR_kbqYAZ8bUkH9Nn#u@Dy@CT@Y z-@q^6Ctw9cY@D_Lv%w@a-9!6N4O5|<~03K+89}-pX^hj8!BKo@} zGGzm3g?<+#l}iBd3+A7Rff=v?YzvqgxRwE6GzLz9$G`*S^h!eGQ6=ya@hWgNcyAMH zMwP%y=KIW}+m0=P%Z(_IU{nU|c`@MCk;?^O#spwh66OLRcWw@VFTf|@R?v)6HU;*9 zZ)0@Bz8w#-tae-t+(7sHp+39;ZcD#+ijgiux(~pvJU<0q1f{vlkZH#No4~P@+gi2Y zOERg8NV2XryDxW!V>yET25SkKC%~qW#F_znz-Re$4R{XRiPZa*;C&4o0&fHa64*;A z-#(HbO%K2dqTW^|@;U*)2Cdlv7lUhAe}sL6fyM}BHrU9jk;8yn0M;(4pc9}qs%+kr zhEoBTB?sn8(-eUIez*nvmESiMi?KX91<=ZAxEnN+e~G%Fi&7)+o~WerN&-?0Gzpzj z^}_}X%oBj4K^TS9mo8S+HihlF_u+LCmNKv?3A;i7tp?B)0tj=!4e)UapdLV5eyQ3;X}dq#=wJ+A>^av!j+Pr zIP*e3&YVbQMpr&@QqT~PuXhwB($N!9l-p|B(ooo$2{r5h7|hvZr5e<<2VlgW)@%r< zX=Gp|+EW4>1Wiyfg%)JT#UB#(ko=+a)sCwjSIc&_l#pPNKjdHS&#u-cg@WT9xvU%y n(%}R9*HRM@r-6!s13$b0(}7_VegiV*00000NkvXXu0mjfdh}pc literal 604 zcmV-i0;BzjP)ezP-!U~Ow#vGqFop8&6bs^RP*@BujQ z5-{xu@D6wjI3t;-T@~mGa05(%dBfRbLz({yFavS}V6Y5;A_9;B^?d{6krJfKP@q&9 zR;GaS{;acm1vpl#Ib~a`{Sqng{a*)BuR|6YFc!pBhx^=JlkgCDqO-mcs0MbVMh$$G z3Rc-_#X4$Jf|m;X1GrG8q0M#SSf4*@4un<#uQffhw!2_Y!7hQH5jo!gy8<|k_&ozA z0{+wluni1@R&$ap1AYO2yoIx+^U~}4p<-PFza@DFJP-T^!9ABL@E&+!^zcC0ebN6D zU|+K!v;_DDoM~ci0tXsgq4fp&F$G4zBLiR~cqgfRGoz(PURnEEP>BJM1HIIn@3ryT ztKjkFh60ON{_CI0-vYn~sEk)!1whj~09*iIm7oAzs$kQW3RLnfj5km=z_wPP4L~j5 zqNM_P1YoxKQYk0bq6C$EOJh?uDNq>m=dTjX3caz0000bdAc8oEppaIOE(LXPbaD_uiXgfuI0y=Ui?$Rg z3N9|rijvq&CiQlchlhJevpDqnjrr%mb8?c{t6qzumxlIL6n!zIh8Gl(U}e3LlM0Ef;V2BeJSjZb=;SQ|z+u z4yaibL-bf>PG6*TZCbM}(t2i;JWOXDi<+RJrJZgbD4Fy&xy-!MTym*5Ce+-mj<=}R zs*bfH=Sq2RG}Riq#p042E*7&*ne}3EUJe(E*_zBou{bA(tHo?vL#bs|A+IvyeHm7t#M^wEtHOK?m*3tk?OFDx*kh6Lst!v$eu1NdssLB&DM32-Q z^h4~jZ>A+~7n2>4r=NU@Dq}tg9ji`Suql$(%vHn+eg}v!7dsOm%)+nCb00000NkvXXu0mjfkE75f literal 1105 zcmV-X1g`suP)x#q=F*uV+e^*R`f-^Sq6q|(SfH%`F= z?n(j61P3ex9tA$kus1LX^fj}oq^RgtO6mr7q}2O?HMS?irV^W|k4nh$BEOc8GLex1 z;E$Bt*@WNf4BunG_GYrzmdMVfIoPLxT1u{NV#9lEuZ?4@`*i{j0tX~r+c0CmI$#u7 zm)dn*pO#xo6*7F85#tbWO{0vh1**VyNj;Ilo=AH&C1bYVD|z|9%7}9|@IszLd;E5W zF~C+yTVr0$@aZpuNYeShlAKtVOL_$O9Qeid&!_xsBWV+`smW&@0rmmAZSQUZ*iPWe zCSwl*Z`$5h2X-Ft25?2mBkHyNZULxmz#T0#{YqO*rhtvWfs9(H0^>RQCnVjT1F9Fe zDP=zbTn{{%6R#RAW@dwxbS|(NSP3ixJ_g0 zL10MIjgj&6`m-re#0eyAcG%uE<5rfq`YV8K!2E>zaDZN%u?Fyx?ZKRQ^*;8N?Js7m zm8I5_mIJ*3;CJBhnD=IYde!zvtuqbLZ z+1Wp{-FG@0Zf^n9CBVa}3?*;iceeY&?g8Mn*j#ARaz(c^ig4fk6G2a4Q5IpQ< z+ehZ)D@oEk;J)yw<;eb^(>=gBp=$$rBrThDU;(N-!9w!nB(M~?Fr^o8zoezJow0l4 zqodkDz6buwSp&F7(vn#zeo40ks9FQlZ*2b<{A((R;6K6v>m?BkcCYQx(#0?72H>hD zHuyu5)k?YuxEnaDfnN>SX?v_`U{S2MH34b@=(k-<`7a9pB)Fr%aLliZwGrC`WsY)j z4joR8Ux5$Opn|E4OX?3!))DG~x~-&>z^b?`rE2WY2Ee9)UACtSnCOJ0uj6xXG_`@L zqWDF(@>oH?Ispt8fl2|W0ShE8Na$CDezH`?Y>!Dg40L5=YOn3%O}3h&(fvDs)sn`8 zg>**W8)@m46ff+q1gLLIfJ%PCtxD9|DHdycXijKP32+@z=ylFEW_x_j_}KsMug<># X<#p#rvt_9&00000NkvXXu0mjfCFcos diff --git a/htdocs/theme/md/img/unlock.png b/htdocs/theme/md/img/unlock.png index afefaa94d47dbe2e173bbcb9d464e02dd2bfc771..44d193e427e2da00e32b61d361bf5a4c05cfdd67 100644 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mW_!9ghEy=lJ+;yEXn=&n!}S42 z+}aHyGL^4!B~9hbk#W+wd?!lgz;&B@97!uVX1WL{TC*tc-?lR*|H%6-?rEnxgKuj^ zH4CumrXF`Ye{OE2p;geA2Z#A?m_}&sDr0?ca~2~Q^d z$jy?`@twY}Zr2L`?M^#Z`u{e&_Dw7JS^eeR8eh_$1*oT%O4WboZSwOMoa3w-0CXmU Mr>mdKI;Vst02NVH+W-In literal 686 zcmV;f0#W^mP)Olo!!}OW@h)zdp|!P)sG@X1m~PTGv-6!D^nC_25~G} zYw|4Hx_9^P?eAAselo^njYfl|r6n}VLn+X{f7UORJ~`}m&unjRr%(6y2cGBIh0B*O zy|ujj^Z{{(mfpf`S9M=7bE2&!|*vy}Cz`?wKDu%B!twi`e;xSRKb2c6VH6d4o|ge1u=>4) z_DNGe_xfw~!mT}M@4j43y^oe_7e71Sb(OSps^?B#Z#Eys8*9I8L{YQ@SO8srCHS_! zaB1<4^IAT>9^#Tjm81V~2cbN?e@nLx{FnZn5Xa%PZ;S~63!uG9>7Afnt5WrGlK@3d zG0F&woPn7U0kfL_e4y1lPyc);d@|ncK zIDz8~Dk=CzsnB@QPG+}&91sA#`bTo7@fY_M@`5-72O=N>2#A2i7E_@M3;_WC2fUM9 Unei{ZxBvhE07*qoM6N<$g5&^0kpKVy diff --git a/htdocs/theme/md/img/vcard.png b/htdocs/theme/md/img/vcard.png index 315abdf179d730998a31ef3be62955f892771663..343b28cbbe9d37e56568f759548cc75bb224c6f2 100644 GIT binary patch literal 230 zcmV}@ z16STFV&uVyKsCMVW3Ng@u|R|U1lsC79qVmRqrJIKtTVU&hrTHm+AXw5mYQ;lhTrnR g)Ji_n%AJet4@7jbJgJE;UjP6A07*qoM6N<$f^T|Zu>b%7 literal 566 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD>a5vj}T*ADJ(?6DY)4 z;1OBOz`!j8!i<;h*8KqrvZOouIx;Y9?C1WI$O`0N3h)VW1=1WG90CFYii(<=nub7N zX=&-?N!BLbm^R>Tj#9ZJLg=` zoO4l2w;tOH0(-X}ySMdP_SSoI_5#7NV|$OC+k5QV-edRnp4+?k+LXQ5=IjOXfZ*J7 zpxCkJQ_h`xe(u__bJxzDyLRu~wdd#V9Xki4?>)ZgU?7)rz>qo3rEa-RUoUAnsv0J=i2VOQ{mj0bpH12u6UF!GDm<=FX%Kzx^dq8DplQ0Hm*nEL z>J1K4wPkX=boD2F**Lqj>UGe$?xV(Ea%*3-eg8G%{-#Q551CgVi21yU;%LJn*&QjhaXnmdKI;Vst E0JRcTumAu6 literal 708 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F?i!z}Ot%6XGh$%ONGeDJd=@D=Hu+ zr>Q0@ZJ?*AZsuVbQ08H0UKgYv=Is~~8eS6RUL5U{kdTm`p6;F8GqNhM_28=yJO$U?T4@JIdXBwk()bDJ==Zy+1}Gn_MLgY@9gt~ zOQ&33+Vkl2+9$`hK0dSI@!1WJ&jZn>>ldyZJpbb0g%?LJy*hUJ^|33jPhNX-`udx* zH(s5&`S$#+cjs@vyL9LMrMvI1+iO#Adu zxZ!*2_Q!kb=HLGLIcb5=MSbS2Ya@l({Fx#&epbijN4)rWW2 zl-8!w_TOO!OUgrrBp&fbt^)!mgpRIz!4M$C_&q5&iD{~fL$Z(SONp*a2BKG!HC7!C zxzez3MPpf)h=g2%MiqmID_el-j8g#(%zPc970o^jlPVaM0~*aIsK_!fSof1bh QCD3jLPgg&ebxsLQ0Pce{aR2}S literal 480 zcmWlVF=!KE7>57Q!K2W6f%frX}wAomjn>{@%gqW*c zsd{P7AIX|Y{rvMUQz0@Zn(M7qqYbGMx3DV36tdJE2PRwJL8 zA@-04hBuko%=J;23&WDp!Wh9?sF6*ScDjgtg8@NXlN)udaF8`DG^d3UQbN)v)o1WE zx0Q4dikfY$Emjsn#IlbNFa=@gM8lFX7NdZ~Lj;Bt+x9%$t-FSE#6^MusZEV_CzmUh z9L6H1K-t%fC-6(Uv$vF=ZeNts@_41?%-F9w!``p#+vOhxym|7`-O9(S s3k!QU4j!%#7JHW~-~O4-;hz^7@q6dY@ekS8OX(w`w%VwU-RqD40~M+QAOHXW From 87d6a5926bfb9756b73ac1844c9224f1a8f92389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 4 Dec 2015 14:06:53 +0100 Subject: [PATCH 123/206] Fixed md theme name --- htdocs/theme/md/graph-color.php | 4 ++-- htdocs/theme/md/style.css.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/theme/md/graph-color.php b/htdocs/theme/md/graph-color.php index 4346d007158..3450180e153 100644 --- a/htdocs/theme/md/graph-color.php +++ b/htdocs/theme/md/graph-color.php @@ -17,8 +17,8 @@ */ /** - * \file htdocs/theme/eldy/graph-color.php - * \brief File to declare colors to use to build graphics with theme Eldy + * \file htdocs/theme/md/graph-color.php + * \brief File to declare colors to use to build graphics with theme Material Design * \ingroup core * * To include file, do this: diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 56df547b9b1..a7a191f45bb 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -61,7 +61,7 @@ $right=($langs->trans("DIRECTION")=='rtl'?'left':'right'); $left=($langs->trans("DIRECTION")=='rtl'?'right':'left'); $path=''; // This value may be used in future for external module to overwrite theme -$theme='eldy'; // Value of theme +$theme='md'; // Value of theme if (! empty($conf->global->MAIN_OVERWRITE_THEME_RES)) { $path='/'.$conf->global->MAIN_OVERWRITE_THEME_RES; $theme=$conf->global->MAIN_OVERWRITE_THEME_RES; } // Define image path files and other constants From 8c03e46a83939e15b4cd30d4bc853dd6f4b329dc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 4 Dec 2015 18:33:57 +0100 Subject: [PATCH 124/206] Removed a TODO --- htdocs/core/lib/project.lib.php | 4 +-- htdocs/projet/class/task.class.php | 41 +++++++++++++++++++++++++++--- htdocs/projet/list.php | 1 - htdocs/projet/tasks/list.php | 3 +-- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 733a83a500f..efbaa78557e 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -344,13 +344,13 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t { // Project ref print ""; - if ($showlineingray) print ''; + //if ($showlineingray) print ''; $projectstatic->id=$lines[$i]->fk_project; $projectstatic->ref=$lines[$i]->projectref; $projectstatic->public=$lines[$i]->public; if ($lines[$i]->public || in_array($lines[$i]->fk_project,$projectsArrayId) || ! empty($user->rights->projet->all->lire)) print $projectstatic->getNomUrl(1); else print $projectstatic->getNomUrl(1,'nolink'); - if ($showlineingray) print ''; + //if ($showlineingray) print ''; print "
'; + echo '
'; echo ' '; $i=0; while ($i < 7) @@ -1028,7 +1028,7 @@ elseif ($action == 'show_week') // View by week $newparam=preg_replace('/viewweek=[0-9]+&?/i','',$newparam); $newparam=preg_replace('/showbirthday_=/i','showbirthday=',$newparam); // Restore correct parameter $newparam.='&viewweek=1'; - echo '
'; + echo '
'; echo ' '; $i=0; while ($i < 7) @@ -1085,7 +1085,7 @@ else // View by day $timestamp=dol_mktime(12,0,0,$month,$day,$year); $arraytimestamp=dol_getdate($timestamp); - echo '
'; + echo '
'; echo ' '; echo ' \n"; echo " \n"; diff --git a/htdocs/comm/action/listactions.php b/htdocs/comm/action/listactions.php index e762b22bc70..86978967970 100644 --- a/htdocs/comm/action/listactions.php +++ b/htdocs/comm/action/listactions.php @@ -39,17 +39,23 @@ $action=GETPOST('action','alpha'); $year=GETPOST("year",'int'); $month=GETPOST("month",'int'); $day=GETPOST("day",'int'); -$actioncode=GETPOST("actioncode","alpha",3); $pid=GETPOST("projectid",'int',3); $status=GETPOST("status",'alpha'); $type=GETPOST('type'); $optioncss = GETPOST('optioncss','alpha'); -$actioncode=GETPOST("actioncode","alpha",3)?GETPOST("actioncode","alpha",3):(GETPOST("actioncode")=='0'?'0':(empty($conf->global->AGENDA_USE_EVENT_TYPE)?'AC_OTH':'')); +if (GETPOST('actioncode','array')) +{ + $actioncode=GETPOST('actioncode','array',3); + if (! count($actioncode)) $actioncode='0'; +} +else +{ + $actioncode=GETPOST("actioncode","alpha",3)?GETPOST("actioncode","alpha",3):(GETPOST("actioncode")=='0'?'0':(empty($conf->global->AGENDA_USE_EVENT_TYPE)?'AC_OTH':'')); +} $dateselect=dol_mktime(0, 0, 0, GETPOST('dateselectmonth'), GETPOST('dateselectday'), GETPOST('dateselectyear')); $datestart=dol_mktime(0, 0, 0, GETPOST('datestartmonth'), GETPOST('datestartday'), GETPOST('datestartyear')); $dateend=dol_mktime(0, 0, 0, GETPOST('dateendmonth'), GETPOST('dateendday'), GETPOST('dateendyear')); - -if ($actioncode == '') $actioncode=(empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE)?'':$conf->global->AGENDA_DEFAULT_FILTER_TYPE); +if (empty($actioncode) && empty($actioncodearray)) $actioncode=(empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE)?'':$conf->global->AGENDA_DEFAULT_FILTER_TYPE); if ($status == '' && ! isset($_GET['status']) && ! isset($_POST['status'])) $status=(empty($conf->global->AGENDA_DEFAULT_FILTER_STATUS)?'':$conf->global->AGENDA_DEFAULT_FILTER_STATUS); if (empty($action) && ! isset($_GET['action']) && ! isset($_POST['action'])) $action=(empty($conf->global->AGENDA_DEFAULT_VIEW)?'show_month':$conf->global->AGENDA_DEFAULT_VIEW); @@ -136,7 +142,7 @@ $userstatic=new User($db); $nav=''; $nav.=''; if ($optioncss != '') $nav.= ''; -if ($actioncode || isset($_GET['actioncode']) || isset($_POST['actioncode'])) $nav.=''; +if ($actioncode) $nav.=''; if ($status || isset($_GET['status']) || isset($_POST['status'])) $nav.=''; if ($filter) $nav.=''; if ($filtert) $nav.=''; @@ -158,7 +164,7 @@ llxHeader('',$langs->trans("Agenda"),$help_url); $listofextcals=array(); $param=''; -if ($actioncode || isset($_GET['actioncode']) || isset($_POST['actioncode'])) $param.="&actioncode=".$actioncode; +if ($actioncode) $param.="&actioncode=".$actioncode; if ($status || isset($_GET['status']) || isset($_POST['status'])) $param.="&status=".$status; if ($filter) $param.="&filter=".$filter; if ($filtert) $param.="&filtert=".$filtert; @@ -186,7 +192,7 @@ if ($filtert > 0 || $usergroup > 0) $sql.=", ".MAIN_DB_PREFIX."actioncomm_resour if ($usergroup > 0) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."usergroup_user as ugu ON ugu.fk_user = ar.fk_element"; $sql.= " WHERE c.id = a.fk_action"; $sql.= ' AND a.entity IN ('.getEntity('agenda', 1).')'; -if ($actioncode) $sql.=" AND c.code='".$db->escape($actioncode)."'"; +if ($actioncode) $sql.=" AND c.code IN ('".$db->escape($actioncode)."')"; if ($pid) $sql.=" AND a.fk_project=".$db->escape($pid); if (! $user->rights->societe->client->voir && ! $socid) $sql.= " AND (a.fk_soc IS NULL OR sc.fk_user = " .$user->id . ")"; if ($socid > 0) $sql.= " AND s.rowid = ".$socid; diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php index 41270d7996e..a0f78608d04 100644 --- a/htdocs/comm/action/peruser.php +++ b/htdocs/comm/action/peruser.php @@ -278,7 +278,7 @@ $paramnoaction=preg_replace('/action=[a-z_]+/','',$param); $head = calendars_prepare_head($paramnoaction); dol_fiche_head($head, $tabactive, $langs->trans('Agenda'), 0, 'action'); -print_actions_filter($form, $canedit, $status, $year, $month, $day, $showbirthday, 0, $filtert, 0, $pid, $socid, $action, $listofextcals, $actioncode, $usergroup); +print_actions_filter($form, $canedit, $status, $year, $month, $day, $showbirthday, 0, $filtert, 0, $pid, $socid, $action, $listofextcals, $actioncode, $usergroup, 'systemauto'); dol_fiche_end(); $showextcals=$listofextcals; diff --git a/htdocs/core/class/html.formactions.class.php b/htdocs/core/class/html.formactions.class.php index bc662e4b434..88f2f87c1e3 100644 --- a/htdocs/core/class/html.formactions.class.php +++ b/htdocs/core/class/html.formactions.class.php @@ -244,10 +244,10 @@ class FormActions * * @param string $selected Type pre-selected (can be 'manual', 'auto' or 'AC_xxx') * @param string $htmlname Nom champ formulaire - * @param string $excludetype Type to exclude - * @param string $onlyautoornot Group list by auto events or not: We keep only the 2 generic lines (AC_OTH and AC_OTH_AUTO) + * @param string $excludetype A type to exclude ('systemauto', 'system', '') + * @param string $onlyautoornot 1=Group all type AC_XXX into 1 line AC_MANUAL. 0=Keep details of type * @param int $hideinfohelp 1=Do not show info help - * @param int $multiselect 1=Allow multiselect of action type for filter or search + * @param int $multiselect 1=Allow multiselect of action type * @return void */ function select_type_actions($selected='',$htmlname='actioncode',$excludetype='',$onlyautoornot=0, $hideinfohelp=0, $multiselect=0) @@ -270,16 +270,15 @@ class FormActions if (! empty($conf->global->AGENDA_ALWAYS_HIDE_AUTO)) unset($arraylist['AC_OTH_AUTO']); - if ($multiselect==1) + if (! empty($multiselect)) { if(!is_array($selected) && !empty($selected)) $selected = explode(',', $selected); - print $form->multiselectarray($htmlname, $arraylist, $selected, 0, 0, '', 0, 0); - + print $form->multiselectarray($htmlname, $arraylist, $selected, 0, 0, 'centpercent', 0, 0); } - else { + else + { print $form->selectarray($htmlname, $arraylist, $selected); } - if ($user->admin && empty($onlyautoornot) && empty($hideinfohelp)) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); } diff --git a/htdocs/core/lib/agenda.lib.php b/htdocs/core/lib/agenda.lib.php index 74815f7bdbd..42244a11718 100644 --- a/htdocs/core/lib/agenda.lib.php +++ b/htdocs/core/lib/agenda.lib.php @@ -41,11 +41,12 @@ * @param int $socid Third party id * @param string $action Action string * @param array $showextcals Array with list of external calendars (used to show links to select calendar), or -1 to show no legend - * @param string $actioncode Preselected value of actioncode for filter on type + * @param string|array $actioncode Preselected value(s) of actioncode for filter on type * @param int $usergroupid Id of group to filter on users + * @param string $excludetype A type to exclude ('systemauto', 'system', '') * @return void */ -function print_actions_filter($form, $canedit, $status, $year, $month, $day, $showbirthday, $filtera, $filtert, $filterd, $pid, $socid, $action, $showextcals=array(), $actioncode='', $usergroupid='') +function print_actions_filter($form, $canedit, $status, $year, $month, $day, $showbirthday, $filtera, $filtert, $filterd, $pid, $socid, $action, $showextcals=array(), $actioncode='', $usergroupid='', $excludetype='') { global $conf, $user, $langs, $db, $hookmanager; global $begin_h, $end_h, $begin_d, $end_d; @@ -87,8 +88,12 @@ function print_actions_filter($form, $canedit, $status, $year, $month, $day, $sh print ''; // Status diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 5587efa2431..f82a4feac45 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -2935,7 +2935,9 @@ td.hidden { /* Module agenda */ /* ============================================================================== */ -table.cal_month { border-spacing: 0px; } +table.cal_month { border-spacing: 0px; } +table.cal_month td:first-child { border-left: 0px; } +table.cal_month td:last-child { border-right: 0px; } .cal_current_month { border-top: 0; border-left: solid 1px #E0E0E0; border-right: 0; border-bottom: solid 1px #E0E0E0; } .cal_current_month_peruserleft { border-top: 0; border-left: solid 3px #6C7C7B; border-right: 0; border-bottom: solid 1px #E0E0E0; } .cal_current_month_oneday { border-right: solid 1px #E0E0E0; } diff --git a/htdocs/theme/md/img/menus/cart.png b/htdocs/theme/md/img/menus/cart.png new file mode 100644 index 0000000000000000000000000000000000000000..8d8da880f0ed080f7cb941c3c0418750a8a19ab2 GIT binary patch literal 259 zcmV+e0sQ`nP)L5zN4myC5pzfdvT9Pn;R$7oy9z5@&ME(Wdb^2b! zpU^P%q#jinDGZ|;eJcwKnO>CBFvp2g%+#Zd5hjsyhhh9q-^#mget1ykKDIem<}9|^H<8&Tb89dDt4}1A4$c;xxeEXQ002ov JPDHLkV1myHXpR5? literal 0 HcmV?d00001 diff --git a/htdocs/theme/md/img/menus/graph.png b/htdocs/theme/md/img/menus/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..fb04031d47a2df76d49938e674ea79ee0082d470 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iDo+>35R22v2@mdKI;Vst064gn-giR5MyT) z#zrHXkA;OzrW^JRyyd~TF>+&RWo86mZ0_~r-C*OJ6u><6ZcsJ@X8^CEcY~@KIQ99r zl~#S;_vy@wrK!_C|Mv~%E-gG-TYIoDaRy)#IHq)$07*qoM6N<$f>csYK>z>% delta 116 zcmV-)0E_?90g(ZaByCtpL_t(I%VS`m3-}-O|K)!|;MM;?ga*ROLEt4q0}v2&1+tnE ztAQ9mXALy=^eduV^a7zFkci~>;=eymtFd|%pIhmm;lO_fAUr^v2B2a%8>oqa?f?M7 Wp_dQLKwr}U0000M`lT9g!$!fBgn3RF;WVKl=CK+V4 z@(pwiK7hnGA*GCzf$;weS3R~f-Oeuq<-F5->KWeprGN1Zf-k8n9bZ2MtIh!@W@B&& z-rf1Yo5eC%0NX0bs0P<%u!pPM#=%SpY~k5-?&0VOPk6L%&Ru{QNao!F?j4wlK{9OJ znOD$L2Owui?Gk;HA;=l?g3S^*!m-@lV7CNT(ArQ*M(lv4_%!(Rpao4ldf6%9!rHH# ecMRhEE%*jzx;+l;APyz~0000w>lX zBvLt;57B~0`Bijjpq9NjlmjLA<1r1Z1|2-6jRGP)hj0QnaL=nAt zb0`XL)4`S9zQ4QuU}5iX{T#1w{4{DfBH0BR zqL~z!Yt)-BNT14zbo{ z8My+p{9vieIg7|0H~|127(>>x153nhAs;{s0Jx^$2j~I-yT}jFAyams=^F?L{Q)u2 zAo2j@yP*Q+Ipd2CO#*~4@7#ZKNPsZy>_DAl4TNcD2ihcy5T>0S2#r9P6*whX4Pn~Z xfifS&y;DY*c6LBiXb=%mi$AmPhV3PffPX10FMX7kh8h3>002ovPDHLkV1g}9qsIUM literal 259 zcmV+e0sQ`nP)L5zN4myC5pzfdvT9Pn;R$7oy9z5@&ME(Wdb^2b! zpU^P%q#jinDGZ|;eJcwKnO>CBFvp2g%+#Zd5hjsyhhh9q-^#mget1ykKDIem<}9|^H<8&Tb89dDt4}1A4$c;xxeEXQ002ov JPDHLkV1myHXpR5? diff --git a/htdocs/theme/md/img/object_bookmark.png b/htdocs/theme/md/img/object_bookmark.png index bde60c8877c7ac3d47ebc9c0609ba0f7be711c92..39109ef5ee61c102adfab2c4c7378fd83f76c040 100644 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=%3?!FCJ6-`&Ea{HEjtmSN`?>!lvI6;90X`wF z|NsAAyLRo~y?c)xJ2qv?lzaE?egFRb`Sa)3u3g)@b?dov=ia}6zjW!+mX?;D>e*9) zx)@7>{DK)Ap4~_Ta%??a978y+Cnp?Ws{raQk(7{NW!*Z>z@XsGy?xc{%*@$QuQsVD wOqE*7y2wcF97|xPYpO$6;LRHmtjnYs7Mk%eyI5Cl1{%cR>FVdQ&MBb@0LwH@(f|Me literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mygXeTLn;`P7cgd|+&Evrz}UEl ztwi-0&;N}M$|0_N5u%m>i!wqk+PCF8{NUfd$e(AjM94uKQ-#;U%aml>V%XwR7!~xz dHM~+87(99#8hq?|z5z{T@O1TaS?83{1OV~(CF%eG diff --git a/htdocs/theme/md/img/warning.png b/htdocs/theme/md/img/warning.png index dc168ba9439b1f04c813c2794c8778dc78b8dcc9..9ec45736b054e87b7c15ec72a3658bc2a6c16040 100644 GIT binary patch delta 376 zcmV-;0f+vn0f+;T8Gi-<0036bj#mHx00v@9M??VM0FeLy4mW`?00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-yu1QHq)(0eDe0003MNklMlFCMu zL4*1PY5b{Dh@?@_MzNSWXq`mu1UrqTHmPHykf#{%2|~aZ(0@h=K0|CKaJ}v|SqpJs z*qO7lhncgx@K>-NCRBnJ}Pw(6TR!pTGI+FxQD!>yk@6f8RufBc&+qK^CIkzKIDFDqB zNyrv}hS%o4qj3sQ&tT^Pvbw*oK_1b41{(pbR6LfV1ayJTZ=;#Y39uf}aLzre=Z2{q ze-YbMmViF67#L%GW39m68?aXE4c`+}Nq{Th;+OyW8n`U_E$jg=u0xC^z&>!xzq3!S WJv3GMxo~Fy0000M(hW|jA z1Z3d=Vhk673cwJ^62-3Q08kPE_hM6G0+mESV@yTq7>d#`71d)Xs>4*&fT5^?c8U}j z9$+YX02DH;^P90028pViBs2vzMs=0000 Date: Fri, 4 Dec 2015 22:50:03 +0100 Subject: [PATCH 127/206] [Qual] Uniformize code --- htdocs/expensereport/payment/card.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/expensereport/payment/card.php b/htdocs/expensereport/payment/card.php index eb5314fbd30..19d5b3206f7 100644 --- a/htdocs/expensereport/payment/card.php +++ b/htdocs/expensereport/payment/card.php @@ -66,7 +66,7 @@ if ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->expensere } else { - setEventMessage($payment->error, 'errors'); + setEventMessages($payment->error, $payment->errors, 'errors'); $db->rollback(); } } @@ -104,7 +104,7 @@ if ($action == 'confirm_valide' && $confirm == 'yes' && $user->rights->expensere } else { - setEventMessage($payment->error); + setEventMessages($payment->error, $payment->errors, 'errors'); $db->rollback(); } } From 4a2bda3491fe25edc2b6abc1e5df30c3c78b910c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 4 Dec 2015 23:25:17 +0100 Subject: [PATCH 128/206] Look enhancement --- htdocs/bookmarks/bookmarks.lib.php | 3 +-- htdocs/core/lib/usergroups.lib.php | 2 +- htdocs/main.inc.php | 8 ++++---- htdocs/theme/eldy/img/1updownarrow.png | Bin 278 -> 0 bytes htdocs/theme/eldy/img/helpdoc_top.png | Bin 0 -> 407 bytes htdocs/theme/eldy/img/history.png | Bin 1362 -> 270 bytes htdocs/theme/eldy/img/logout_top.png | Bin 0 -> 293 bytes htdocs/theme/eldy/img/object_action_rdv.png | Bin 675 -> 0 bytes htdocs/theme/eldy/img/object_contact_all.png | Bin 810 -> 0 bytes htdocs/theme/eldy/img/printer_top.png | Bin 0 -> 316 bytes htdocs/theme/eldy/style.css.php | 7 +++++-- htdocs/theme/md/img/1updownarrow.png | Bin 278 -> 0 bytes htdocs/theme/md/img/help.png | Bin 657 -> 312 bytes htdocs/theme/md/img/helpdoc_top.png | Bin 0 -> 267 bytes htdocs/theme/md/img/logout_top.png | Bin 0 -> 168 bytes htdocs/theme/md/img/object_action_rdv.png | Bin 118 -> 0 bytes htdocs/theme/md/img/object_contact_all.png | Bin 170 -> 0 bytes htdocs/theme/md/img/object_group.png | Bin 170 -> 655 bytes htdocs/theme/md/img/object_phoning.png | Bin 200 -> 577 bytes htdocs/theme/md/img/object_user.png | Bin 164 -> 581 bytes htdocs/theme/md/img/printer_top.png | Bin 0 -> 167 bytes htdocs/theme/md/img/switch_off.png | Bin 292 -> 1252 bytes htdocs/theme/md/img/switch_off_old.png | Bin 0 -> 292 bytes htdocs/theme/md/img/switch_on.png | Bin 257 -> 1228 bytes htdocs/theme/md/img/switch_on_old.png | Bin 0 -> 257 bytes htdocs/theme/md/img/title_generic.png | Bin 197 -> 138 bytes htdocs/theme/md/style.css.php | 15 +++++++++------ 27 files changed, 20 insertions(+), 15 deletions(-) delete mode 100644 htdocs/theme/eldy/img/1updownarrow.png create mode 100644 htdocs/theme/eldy/img/helpdoc_top.png create mode 100644 htdocs/theme/eldy/img/logout_top.png delete mode 100644 htdocs/theme/eldy/img/object_action_rdv.png delete mode 100644 htdocs/theme/eldy/img/object_contact_all.png create mode 100644 htdocs/theme/eldy/img/printer_top.png delete mode 100644 htdocs/theme/md/img/1updownarrow.png create mode 100644 htdocs/theme/md/img/helpdoc_top.png create mode 100644 htdocs/theme/md/img/logout_top.png delete mode 100644 htdocs/theme/md/img/object_action_rdv.png delete mode 100644 htdocs/theme/md/img/object_contact_all.png create mode 100644 htdocs/theme/md/img/printer_top.png create mode 100644 htdocs/theme/md/img/switch_off_old.png create mode 100644 htdocs/theme/md/img/switch_on_old.png diff --git a/htdocs/bookmarks/bookmarks.lib.php b/htdocs/bookmarks/bookmarks.lib.php index ee6003d0119..4af1815c767 100644 --- a/htdocs/bookmarks/bookmarks.lib.php +++ b/htdocs/bookmarks/bookmarks.lib.php @@ -50,8 +50,7 @@ function printBookmarksList($aDb, $aLangs) $ret.= ''; } diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index d27df85f4ac..a3c647a5e47 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1461,13 +1461,13 @@ function top_menu($head, $title='', $target='', $disablejs=0, $disablehead=0, $a $logouthtmltext.=$langs->trans("Logout").'
'; $logouttext .=''; - $logouttext .= img_picto($langs->trans('Logout').":".$langs->trans('Logout'), 'logout.png', 'class="login"', 0, 0, 1); + $logouttext .= img_picto($langs->trans('Logout').":".$langs->trans('Logout'), 'logout_top.png', 'class="login"', 0, 0, 1); $logouttext .=''; } else { $logouthtmltext.=$langs->trans("NoLogoutProcessWithAuthMode",$_SESSION["dol_authmode"]); - $logouttext .= img_picto($langs->trans('Logout').":".$langs->trans('Logout'), 'logout.png', 'class="login"', 0, 0, 1); + $logouttext .= img_picto($langs->trans('Logout').":".$langs->trans('Logout'), 'logout_top.png', 'class="login"', 0, 0, 1); } print ''; print '
'.$langs->trans("Day".$arraytimestamp['wday'])."
'; print $langs->trans("Type"); print '  '; - //select_type_actions($selected='',$htmlname='actioncode',$excludetype='',$onlyautoornot=0, $hideinfohelp=0, $multiselect=true) - print $formactions->select_type_actions($actioncode, "actioncode", '', (empty($conf->global->AGENDA_USE_EVENT_TYPE)?1:0), 0, (empty($conf->global->AGENDA_USE_EVENT_TYPE)?0:1)); + $multiselect=0; + if (! empty($conf->global->MAIN_ENABLE_MULTISELECT_TYPE)) // We use an option here because it adds bugs when used on agenda page "peruser" and "list" + { + $multiselect=(!empty($conf->global->AGENDA_USE_EVENT_TYPE)); + } + print $formactions->select_type_actions($actioncode, "actioncode", $excludetype, (empty($conf->global->AGENDA_USE_EVENT_TYPE)?1:0), 0, $multiselect); print '
'; if ($user->rights->bookmark->creer) { - $ret.= ''; - //$ret.=img_picto($langs->trans('AddThisPageToBookmarks'),'edit_add').' '; + $ret.= ''; $ret.=img_object($langs->trans('AddThisPageToBookmarks'),'bookmark'); $ret.= ''; } diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index 5083ec3b495..56b44845e3b 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -477,7 +477,7 @@ function show_theme($fuser,$edit=0,$foruserprofile=false) if ($color) print ''; else print $langs->trans("Default"); } - print '   ('.$langs->trans("Default").': 6e7896, '.$langs->trans("NotSupportedByAllThemes").', '.$langs->trans("PressF5AfterChangingThis").')'; + print '   ('.$langs->trans("Default").': 7882aa, '.$langs->trans("NotSupportedByAllThemes").', '.$langs->trans("PressF5AfterChangingThis").')'; print 'id . '">' . img_edit($langs->trans('SetDate'), 1) . '
'; - print '
'; + print ''; if (! empty($object->brouillon) && $action == 'editdate') { print ''; print ''; @@ -1781,7 +1781,7 @@ if ($action == 'create') if ($action != 'editecheance' && ! empty($object->brouillon)) print 'id . '">' . img_edit($langs->trans('SetConditions'), 1) . '
'; - print '
'; + print ''; if (! empty($object->brouillon) && $action == 'editecheance') { print ''; print ''; @@ -1809,7 +1809,7 @@ if ($action == 'create') if ($action != 'editconditions' && ! empty($object->brouillon)) print 'id . '">' . img_edit($langs->transnoentitiesnoconv('SetConditions'), 1) . '
'; - print '
'; + print ''; if ($action == 'editconditions') { $form->form_conditions_reglement($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->cond_reglement_id, 'cond_reglement_id'); } else { @@ -1822,7 +1822,7 @@ if ($action == 'create') $langs->load('deliveries'); print '
'; print $form->editfieldkey($langs->trans('DeliveryDate'), 'date_livraison', $object->date_livraison, $object, $user->rights->propal->creer); - print ''; + print ''; print $form->editfieldval($langs->trans('DeliveryDate'), 'date_livraison', $object->date_livraison, $object, $user->rights->propal->creer, 'day'); print '
id . '">' . img_edit($langs->transnoentitiesnoconv('SetAvailability'), 1) . '
'; - print ''; + print ''; if ($action == 'editavailability') { $form->form_availability($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->availability_id, 'availability_id', 1); } else { @@ -1856,7 +1856,7 @@ if ($action == 'create') if ($action != 'editshippingmethod' && $user->rights->propal->creer) print 'id.'">'.img_edit($langs->trans('SetShippingMode'),1).''; print ''; - print ''; + print ''; if ($action == 'editshippingmethod') { $form->formSelectShippingMethod($_SERVER['PHP_SELF'].'?id='.$object->id, $object->shipping_method_id, 'shipping_method_id', 1); } else { @@ -1874,7 +1874,7 @@ if ($action == 'create') if ($action != 'editdemandreason' && ! empty($object->brouillon)) print 'id . '">' . img_edit($langs->transnoentitiesnoconv('SetDemandReason'), 1) . ''; print ''; - print ''; + print ''; if ($action == 'editdemandreason') { $form->formInputReason($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->demand_reason_id, 'demand_reason_id', 1); } else { @@ -1892,7 +1892,7 @@ if ($action == 'create') if ($action != 'editmode' && ! empty($object->brouillon)) print 'id . '">' . img_edit($langs->transnoentitiesnoconv('SetMode'), 1) . ''; print ''; - print ''; + print ''; if ($action == 'editmode') { $form->form_modes_reglement($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->mode_reglement_id, 'mode_reglement_id'); } else { @@ -1912,7 +1912,7 @@ if ($action == 'create') if ($action != 'classify') print '' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ''; print ''; - print ''; + print ''; if ($action == 'classify') { $form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1); } else { @@ -1941,7 +1941,7 @@ if ($action == 'create') // Outstanding Bill print ''; print $langs->trans('OutstandingBill'); - print ''; + print ''; print price($soc->get_OutstandingBill()) . ' / '; print price($soc->outstanding_limit, 0, $langs, 1, - 1, - 1, $conf->currency); print ''; @@ -1958,7 +1958,7 @@ if ($action == 'create') if ($action != 'editbankaccount' && $user->rights->propal->creer) print 'id.'">'.img_edit($langs->trans('SetBankAccount'),1).''; print ''; - print ''; + print ''; if ($action == 'editbankaccount') { $form->formSelectAccount($_SERVER['PHP_SELF'].'?id='.$object->id, $object->fk_account, 'fk_account', 1); } else { @@ -1979,7 +1979,7 @@ if ($action == 'create') else print ' '; print ''; print ''; - print ''; + print ''; if ($action != 'editincoterm') { print $form->textwithpicto($object->display_incoterms(), $object->libelle_incoterms, 1); @@ -1992,16 +1992,20 @@ if ($action == 'create') } // Other attributes - $cols = 3; + $cols = 5; include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php'; // Amount HT - print '' . $langs->trans('AmountHT') . ''; + print '' . $langs->trans('AmountHT') . ''; print '' . price($object->total_ht, '', $langs, 0, - 1, - 1, $conf->currency) . ''; // Margin Infos - if (! empty($conf->margin->enabled)) { - print ''; + if (! empty($conf->margin->enabled)) + { + $rowspan=4; + if ($mysoc->localtax1_assuj == "1" || $object->total_localtax1 != 0) $rowspan++; + if ($mysoc->localtax2_assuj == "1" || $object->total_localtax2 != 0) $rowspan++; + print ''; $formmargin->displayMarginInfos($object); print ''; } @@ -2017,7 +2021,7 @@ if ($action == 'create') { print '' . $langs->transcountry("AmountLT1", $mysoc->country_code) . ''; print '' . price($object->total_localtax1, '', $langs, 0, - 1, - 1, $conf->currency) . ''; - print ''; + print ''; } if ($mysoc->localtax2_assuj == "1" || $object->total_localtax2 != 0) // Localtax2 { diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 505f6bce8e5..c82d651a01d 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -180,6 +180,7 @@ YouCanCompleteRef=If you want to complete the ref with some information (to use OpenedProjectsByThirdparties=Opened projects by thirdparties OpportunityTotalAmount=Opportunities total amount OpportunityPonderatedAmount=Opportunities weighted amount +OpportunityPonderatedAmountDesc=Opportunities amount weighted with probability (depending on status of opportunity) OppStatusPROSP=Prospection OppStatusQUAL=Qualification OppStatusPROPO=Proposal diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 4695403aeff..e983a16f3f9 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -572,8 +572,9 @@ td.showDragHandle { } #id-right { /* This must stay id-right and not be replaced with echo $right */ width: 100%; + padding-bottom: 10px; - padding-left: 224px; + padding-left: 229px; padding-top: 12px; } @@ -626,7 +627,7 @@ td.showDragHandle { div.fiche { margin-: global->MAIN_MENU_USE_JQUERY_LAYOUT))?($dol_hide_leftmenu?'4':'20'):'24')); ?>px; - margin-: dol_optimize_smallscreen)?'12':'4')); ?>px; + margin-: dol_optimize_smallscreen)?'16':'4')); ?>px; dol_hide_leftmenu) && ! empty($conf->dol_hide_topmenu)) print 'margin-top: 4px;'; ?> margin-bottom: 15px; } @@ -837,14 +838,19 @@ li.tmenu, li.tmenusel { font-weight: normal; } li.tmenusel, li.tmenu:hover { +/* background-image: -o-linear-gradient(bottom, rgba(250,250,250,0.3) 0%, rgba(0,0,0,0.3) 100%) !important; background-image: -moz-linear-gradient(bottom, rgba(0,0,0,0.5) 0%, rgba(250,250,250,0) 100%) !important; background-image: -webkit-linear-gradient(bottom, rgba(0,0,0,0.3) 0%, rgba(250,250,250,0) 100%) !important; background-image: -ms-linear-gradient(bottom, rgba(250,250,250,0.3) 0%, rgba(0,0,0,0.3) 100%) !important; background-image: linear-gradient(bottom, rgba(250,250,250,0.3) 0%, rgba(0,0,0,0.3) 100%) !important; background: rgb(); +*/ /* background: url() 50% 0 repeat-x !important; Nicer but problem when menu wrap on 2 lines */ } +li.tmenusel, li.tmenu:hover { + opacity: .50; /* show only a slight shadow */ +} .tmenuend .tmenuleft { width: 0px; } /* .tmenuend { display: none; } */ div.tmenuleft @@ -2256,7 +2262,6 @@ div.liste_titre_bydiv { border-collapse: collapse; display: table; padding: 2px 0px 2px 0; - box-shadow: 2px 2px 4px #CCC; width: calc(100% - 1px); /* 1px more, i don't know why */ } tr.liste_titre, tr.liste_titre_sel, form.liste_titre, form.liste_titre_sel, table.dataTable.tr @@ -2723,10 +2728,10 @@ img.datecallink { padding-left: 2px !important; padding-right: 2px !important; } table.dp { width: 180px; background-color: #FFFFFF; - border-top: solid 2px #f4f4f4; + /*border-top: solid 2px #f4f4f4; border-: solid 2px #f4f4f4; border-: solid 1px #222222; - border-bottom: solid 1px #222222; + border-bottom: solid 1px #222222; */ padding: 0px; border-spacing: 0px; border-collapse: collapse; @@ -2735,7 +2740,7 @@ table.dp { /* Barre titre */ .dpHead,.tpHead,.tpHour td:Hover .tpHead{ font-weight:bold; - background-color:#b3c5cc; + background-color: #888; color:white; font-size:11px; cursor:auto; @@ -2743,7 +2748,7 @@ table.dp { /* Barre navigation */ .dpButtons,.tpButtons { text-align:center; - background-color:#617389; + background-color: #888; color:#FFFFFF; font-weight:bold; cursor:pointer; @@ -2778,7 +2783,7 @@ table.dp { padding:0px; font-size:9px; border-width:0px; - color:#0B63A2; + color: #eee; vertical-align:middle; cursor: pointer; } From ff4f1e7a5be7becb0a1de96a8c7cd47cbc942c59 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 5 Dec 2015 19:20:39 +0100 Subject: [PATCH 132/206] Debug 3.9 --- htdocs/bookmarks/card.php | 6 +- htdocs/core/class/html.formfile.class.php | 8 +- htdocs/core/lib/company.lib.php | 9 +- htdocs/core/tpl/resource_view.tpl.php | 9 +- htdocs/expensereport/list.php | 4 +- htdocs/projet/card.php | 8 +- htdocs/resource/element_resource.php | 108 ++++++++++-------- htdocs/theme/common/gmap.png | Bin 675 -> 358 bytes htdocs/theme/eldy/style.css.php | 2 +- .../theme/md/img/object_category-expanded.png | Bin 104 -> 198 bytes htdocs/theme/md/img/object_category.png | Bin 99 -> 104 bytes htdocs/theme/md/style.css.php | 80 ++++--------- 12 files changed, 104 insertions(+), 130 deletions(-) diff --git a/htdocs/bookmarks/card.php b/htdocs/bookmarks/card.php index daacc4ca4da..62b4ccddce6 100644 --- a/htdocs/bookmarks/card.php +++ b/htdocs/bookmarks/card.php @@ -1,6 +1,6 @@ - * Copyright (C) 2005-2013 Laurent Destailleur + * Copyright (C) 2005-2015 Laurent Destailleur * Copyright (C) 2014 Marcos García * * This program is free software; you can redistribute it and/or modify @@ -165,7 +165,7 @@ if ($action == 'create') print ''.$langs->trans("ChooseIfANewWindowMustBeOpenedOnClickOnBookmark").''; print ''.$langs->trans("Owner").''; - $form->select_dolusers(isset($_POST['userid'])?$_POST['userid']:$user->id,'userid',1); + print $form->select_dolusers(isset($_POST['userid'])?$_POST['userid']:$user->id,'userid',1); print ' '; // Position @@ -262,7 +262,7 @@ if ($id > 0 && ! preg_match('/^add/i',$action)) print ''.$langs->trans("Owner").''; if ($action == 'edit' && $user->admin) { - $form->select_dolusers(isset($_POST['userid'])?$_POST['userid']:($bookmark->fk_user?$bookmark->fk_user:''),'userid',1); + print $form->select_dolusers(isset($_POST['userid'])?$_POST['userid']:($bookmark->fk_user?$bookmark->fk_user:''),'userid',1); } else { diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index c539efa5a9b..1226d3b35ba 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -176,18 +176,18 @@ class FormFile $out .= ''; $out .= ''; - $out .= '
'; - $out .= '
'; + $out .= '
'; + $out .= '
'; if (! empty($conf->global->OPTIMIZEFORTEXTBROWSER)) $out .= ' '; $out .= ''; $out .= '
'; - $out .= '
'; + $out .= '
'; if (! empty($conf->global->OPTIMIZEFORTEXTBROWSER)) $out .= ' '; $out .= ''; $out .= ''; $out .= ''; $out .= '
'; - $out .= '
'; + $out .= '
'; $out .= 'global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled':''); $out .= '>'; diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index 70988d7e330..c7b370b287f 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -658,6 +658,7 @@ function show_contacts($conf,$langs,$db,$object,$backtopage='') if ($num || (GETPOST('button_search') || GETPOST('button_search.x') || GETPOST('button_search_x'))) { print ''; + // Name - Position print ''; print ''; @@ -766,10 +767,8 @@ function show_contacts($conf,$langs,$db,$object,$backtopage='') print ''."\n"; - print "
\n"; -?> - -trans('Address')).'" style="display: none;">
'; return $i; } @@ -1343,7 +1342,7 @@ function show_actions_done($conf,$langs,$db,$object,$objcon='',$noprint=0) $i++; } $out.="\n"; - $out.="
\n"; + //$out.="
\n"; } if ($noprint) return $out; diff --git a/htdocs/core/tpl/resource_view.tpl.php b/htdocs/core/tpl/resource_view.tpl.php index a5e5ab21919..dd775662db6 100644 --- a/htdocs/core/tpl/resource_view.tpl.php +++ b/htdocs/core/tpl/resource_view.tpl.php @@ -37,7 +37,10 @@ if( (array) $linked_resources && count($linked_resources) > 0) { $var=!$var; $object_resource = fetchObjectByElement($linked_resource['resource_id'],$linked_resource['resource_type']); - if($mode == 'edit' && $linked_resource['rowid'] == GETPOST('lineid')) + + //$element_id = $linked_resource['rowid']; + + if ($mode == 'edit' && $linked_resource['rowid'] == GETPOST('lineid')) { print '
'; @@ -58,7 +61,7 @@ if( (array) $linked_resources && count($linked_resources) > 0) else { $style=''; - if($linked_resource['rowid'] == GETPOST('lineid')) + if ($linked_resource['rowid'] == GETPOST('lineid')) $style='style="background: orange;"'; print '
'; @@ -91,8 +94,6 @@ if( (array) $linked_resources && count($linked_resources) > 0) print '
'; } - - } print '
'; diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index 10b19d66da3..c59a594b5a6 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -79,7 +79,7 @@ $fieldstosearchall = array( * View */ -$html = new Form($db); +$form = new Form($db); $formother = new FormOther($db); $expensereporttmp=new ExpenseReport($db); @@ -247,7 +247,7 @@ if ($resql) // User if ($user->rights->expensereport->readall || $user->rights->expensereport->lire_tous){ print ''; - $html->select_dolusers($search_user,"search_user",1,"",0,''); + print $form->select_dolusers($search_user,"search_user",1,"",0,''); print ''; } else { print ' '; diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index 51939d8e9fc..463cda3953c 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -507,13 +507,13 @@ if ($action == 'create' && $user->rights->projet->creer) // Opportunity amount print ''.$langs->trans("OpportunityAmount").''; - print ''; + print ''; print ''; } // Budget print ''.$langs->trans("Budget").''; - print ''; + print ''; print ''; // Description @@ -672,13 +672,13 @@ else // Opportunity amount print ''.$langs->trans("OpportunityAmount").''; - print ''; + print ''; print ''; } // Budget print ''.$langs->trans("Budget").''; - print ''; + print ''; print ''; // Description diff --git a/htdocs/resource/element_resource.php b/htdocs/resource/element_resource.php index 5c2414d22a2..21dad5afa05 100644 --- a/htdocs/resource/element_resource.php +++ b/htdocs/resource/element_resource.php @@ -49,7 +49,7 @@ $hookmanager->initHooks(array('element_resource')); $object->available_resources = array('resource'); // Get parameters -$id = GETPOST('id','int'); +$id = GETPOST('id','int'); $action = GETPOST('action','alpha'); $mode = GETPOST('mode','alpha'); $lineid = GETPOST('lineid','int'); @@ -61,30 +61,40 @@ $busy = GETPOST('busy','int'); $mandatory = GETPOST('mandatory','int'); $cancel = GETPOST('cancel','alpha'); $confirm = GETPOST('confirm','alpha'); +$socid = GETPOST('socid','int'); +if ($socid > 0) +{ + $element_id = $socid; + $element = 'societe'; +} + + /* * Actions */ if ($action == 'add_element_resource' && ! $cancel) { - $objstat = fetchObjectByElement($element_id, $element); + $error++; $res = 0; - if ($resource_id > 0) + if (! ($resource_id > 0)) { - $res = $objstat->add_element_resource($resource_id, $resource_type, $busy, $mandatory); - } - if ($res > 0) - { - setEventMessage($langs->trans('ResourceLinkedWithSuccess'),'mesgs'); - header("Location: ".$_SERVER['PHP_SELF'].'?element='.$element.'&element_id='.$element_id); - exit; + $error++; + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Resource")), null, 'errors'); + $action=''; } else { - setEventMessage($langs->trans('ErrorWhenLinkingResource') . " " . $objstat->error, 'errors'); - header("Location: ".$_SERVER['PHP_SELF'].'?mode=add&resource_type='.$resource_type.'&element='.$element.'&element_id='.$element_id); + $objstat = fetchObjectByElement($element_id, $element); + + $res = $objstat->add_element_resource($resource_id, $resource_type, $busy, $mandatory); + } + if (! $error && $res > 0) + { + setEventMessage($langs->trans('ResourceLinkedWithSuccess'),'mesgs'); + header("Location: ".$_SERVER['PHP_SELF'].'?element='.$element.'&element_id='.$element_id); exit; } } @@ -103,7 +113,7 @@ if ($action == 'update_linked_resource' && $user->rights->resource->write && !GE if ($result >= 0) { setEventMessage($langs->trans('RessourceLineSuccessfullyUpdated')); - Header("Location: ".$_SERVER['PHP_SELF']."?element=".$element."&element_id=".$element_id); + header("Location: ".$_SERVER['PHP_SELF']."?element=".$element."&element_id=".$element_id); exit; } else { @@ -115,25 +125,18 @@ if ($action == 'update_linked_resource' && $user->rights->resource->write && !GE // Delete a resource linked to an element if ($action == 'confirm_delete_linked_resource' && $user->rights->resource->delete && $confirm === 'yes') { - $res = $object->fetch($id); - if($res > 0) - { - $result = $object->delete_resource($lineid,$element); + $result = $object->delete_resource($lineid,$element); - if ($result >= 0) - { - setEventMessage($langs->trans('RessourceLineSuccessfullyDeleted')); - Header("Location: ".$_SERVER['PHP_SELF']."?element=".$element."&element_id=".$element_id); - exit; - } - else { - setEventMessage($object->error,'errors'); - } - } - else - { - setEventMessage($object->error,'errors'); - } + if ($result >= 0) + { + setEventMessage($langs->trans('RessourceLineSuccessfullyDeleted')); + header("Location: ".$_SERVER['PHP_SELF']."?element=".$element."&element_id=".$element_id); + exit; + } + else + { + setEventMessage($object->error,'errors'); + } } $parameters=array('resource_id'=>$resource_id); @@ -178,12 +181,13 @@ else /* * Specific to agenda module */ - if($element_id && $element == 'action') + if ($element_id && $element == 'action') { require_once DOL_DOCUMENT_ROOT.'/core/lib/agenda.lib.php'; $act = fetchObjectByElement($element_id,$element); - if(is_object($act)) { + if (is_object($act)) + { $head=actions_prepare_head($act); @@ -219,26 +223,36 @@ else if ($element_id && $element == 'societe') { $socstatic = fetchObjectByElement($element_id,$element); - if (is_object($socstatic)) { + if (is_object($socstatic)) + { + $savobject = $object; + + $object = $socstatic; + require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; $head = societe_prepare_head($socstatic); dol_fiche_head($head, 'resources', $langs->trans("ThirdParty"),0,'company'); - // Affichage fiche action en mode visu - print ''; - - //$linkback = ''.$langs->trans("BackToList").''; - - // Name - print ''; - print ''; - print ''; + dol_banner_tab($socstatic, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + + print '
'; + + print '
'; + print '
'.$langs->trans('ThirdPartyName').''; - print $form->showrefnav($socstatic, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); - print '
'; + + // Alias name (commercial, trademark or alias name) + print '"; + print '
'.$langs->trans('AliasNames').''; + print $socstatic->name_alias; + print "
'; + print '
'; + dol_fiche_end(); + + $object = $savobject; } } @@ -248,7 +262,7 @@ else - foreach ($object->available_resources as $modresources => $resources) + foreach ($object->available_resources as $modresources => $resources) { $resources=(array) $resources; // To be sure $resources is an array foreach($resources as $resource_obj) @@ -273,7 +287,7 @@ else { $res=include DOL_DOCUMENT_ROOT . '/core/tpl/resource_add.tpl.php'; } - + //var_dump($element_id); if ($mode != 'add' || $resource_obj != $resource_type) { diff --git a/htdocs/theme/common/gmap.png b/htdocs/theme/common/gmap.png index 0423a91295654c414c56ff401e1b03257fb2c45e..201577281f048ad530a5ffc90ae5ddcde1ea09cb 100644 GIT binary patch literal 358 zcmV-s0h#`ZP)L0Z}plWdk}vvjJrS(g|RMG6Aqb7$A{1XxV@ckc4-Yja>Hv5+YJ0 z`@Zk)|9@v@%2$@0LdF-ORexYj_a=L>JU3B;5xtXV9(=v z7=~AQoFqwQjCqhVOm0FZM+J(aXn1%{@;#lN!cJf-ut%_WFfVNuGZ zE9D-K?ne(ih?E>DjohI=hq~2#Q6&T{Dmml)MoX617w|ux5f5W7c>n+a07*qoM6N<$ Ef*ux?eEeSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00H|+ zL_t(2&xOiQNEA^3fbs9mo7q;ql-5f_CHL1FZVvLGY88No`h5kww>tV=?);UPLC zwS*!>*rh|a=oTz==u)9kL6IV&lBqT6+MnIr)o9+#o7bs}Q2ve|p8)9Y?q+Cch_1_5 zcDF`IRYvUOs<9^C$;yZKuJz7lG8wYjETW^MgIq4h_4DWMo`^*+Y^jK1YzHYNu7;;8 zK~Hbr&B0VEg#fsiKG}1%F*e{!2jSS*PJ~d}2q}?La%Z7*;8y>@YYU*o@&`Omfv=b< zmKmJp^?K>g@<10$PJ^IGym@JmbPRv6PV6kw2 zm$mW~VZ_0a2BkbaOW;_7Fz^w8rvm0&H?%2zpLw?M)jQRk*kB8Iu&a@`s~!ip#=!S6 zz~kxp#hKyfWeecZ$HlISP-A?B2z>TcMG2Kp=qntp8Fd#91ISn`#^Z3qf0#W2kk99l{N<}+ zUK6GgwMVrv7y)Nryib2|-BH$x$KwFe{zENhBHeCowCz^_O-)Vw)1HQHnX%3`W7pJn z@;`}00-_u1a_xIHKr)$RUDZ{az5x`A#r5a<`ugMLa#^hHe*lG3+UN9y-);Z^002ov JPDHLkV1l%FFtz{y diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 0c778179606..bb00659f171 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -64,7 +64,7 @@ $theme='eldy'; // Value of theme if (! empty($conf->global->MAIN_OVERWRITE_THEME_RES)) { $path='/'.$conf->global->MAIN_OVERWRITE_THEME_RES; $theme=$conf->global->MAIN_OVERWRITE_THEME_RES; } // Define image path files and other constants -$fontlist='arial,tahoma,verdana,helvetica'; //$fontlist='Helvetica, Verdana, Arial, sans-serif'; +$fontlist='roboto,arial,tahoma,verdana,helvetica'; //$fontlist='helvetica, verdana, arial, sans-serif'; $img_head=''; $img_button=dol_buildpath($path.'/theme/'.$theme.'/img/button_bg.png',1); $dol_hide_topmenu=$conf->dol_hide_topmenu; diff --git a/htdocs/theme/md/img/object_category-expanded.png b/htdocs/theme/md/img/object_category-expanded.png index b0292d92aaec99817b1a0dff1c1c354cd715f10c..0e49c902a096b8a10c90061911198af46c60d266 100644 GIT binary patch delta 169 zcmc~e#yCNxo+-)O-G$+Qd;gjJ3=9mM1s;*b3=G`DAk4@xYmNj^kiEpy*OmP~537(c zyY22>Za|@MPZ!4!jq^t@d2=05;Bmb;`$FsPU6;-wml83RLcgPW7(TdW&z}Bg{+SFM5Uo(kq-V-$$ UoKF{FYqS%RZr(nEV0vj+jplT_BcvG=QJl5qVWD4NK4*j@0Uf<}%WQo)!k!BH^jp}maRg8=49Dr?@@`&Beaxc;9g(yL|F7<@92?H4mc X<^365#fR@|GXR07tDnm{r-UW|QDzws diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index e983a16f3f9..13b2e4df171 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -65,7 +65,7 @@ $theme='md'; // Value of theme if (! empty($conf->global->MAIN_OVERWRITE_THEME_RES)) { $path='/'.$conf->global->MAIN_OVERWRITE_THEME_RES; $theme=$conf->global->MAIN_OVERWRITE_THEME_RES; } // Define image path files and other constants -$fontlist='Open Sans,sans-serif'; //$fontlist='Verdana,Helvetica,Arial,sans-serif'; +$fontlist='roboto,arial,tahoma,verdana,helvetica'; //$fontlist='verdana,helvetica,arial,sans-serif'; $img_head=''; $img_button=dol_buildpath($path.'/theme/'.$theme.'/img/button_bg.png',1); $dol_hide_topmenu=$conf->dol_hide_topmenu; @@ -1704,62 +1704,8 @@ span.butAction, span.butActionDelete { } -/* -.butAction, .butAction:link, .butAction:visited, .butAction:hover, .butAction:active, .butActionDelete, .butActionDelete:link, .butActionDelete:visited, .butActionDelete:hover, .butActionDelete:active -{ - text-decoration: none; - white-space: nowrap; - padding: 0.4em em; - margin: 0em em; - font-family: ; - - font-weight: bold; - background: white; - border: 1px solid #8CACBB; - color: #434956; - -moz-border-radius:0px 2px 0px 2px; - -webkit-border-radius:0px 2px 0px 2px; - border-radius:0px 2px 0px 2px; - -moz-box-shadow: 2px 2px 3px #f4f4f4; - -webkit-box-shadow: 2px 2px 3px #f4f4f4; - box-shadow: 2px 2px 3px #f4f4f4; -} - -.butAction:hover { - background: #dee7ec; -} - -.butActionDelete, .butActionDelete:link, .butActionDelete:visited, .butActionDelete:hover, .butActionDelete:active { - border: 1px solid #997777; -} - -.butActionDelete:hover { - background: #FFe7ec; -} - -.butActionRefused { - text-decoration: none !important; - white-space: nowrap !important; - cursor: not-allowed; - padding: 0.4em em; - margin: 0em em; - font-family: !important; - - font-weight: bold !important; - background: white !important; - border: 1px solid #AAAAAA !important; - color: #AAAAAA !important; - -moz-border-radius:0px 2px 0px 2px; - -webkit-border-radius:0px 2px 0px 2px; - border-radius:0px 2px 0px 2px; - -moz-box-shadow: 3px 3px 4px #f4f4f4; - -webkit-box-shadow: 3px 3px 4px #f4f4f4; - box-shadow: 3px 3px 4px #f4f4f4; -} -*/ - /* Prepare for bootstrap look */ -.butAction, .butActionDelete, .butActionRefused { +.button, .butAction, .butActionDelete, .butActionRefused { border-color: #c5c5c5; border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); display: inline-block; @@ -1792,7 +1738,7 @@ span.butAction, span.butActionDelete { box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); } -.butAction { +.button, .butAction { color: #ffffff !important; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); background-color: #006dcc; @@ -1807,7 +1753,21 @@ span.butAction, span.butActionDelete { border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } - +.button:disabled, .butAction:disabled { + color: #666 !important; + text-shadow: none; + border-color: #555; + cursor: not-allowed; + + background-color: #f5f5f5; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x +} + .butActionDelete { color: #ffffff !important; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); @@ -1946,7 +1906,7 @@ table.liste, table.noborder, table.formdoc, div.noborder { border-color: #BBB; border-style: solid; - margin: 0px 0px 2px 0px; + margin: 0px 0px 8px 0px; /* -moz-box-shadow: 2px 2px 4px #CCC; -webkit-box-shadow: 2px 2px 4px #CCC; @@ -3465,7 +3425,7 @@ a span.select2-chosen line-height: 13px; color: #333; cursor: default; - border: 1px solid #aaaaaa; + border: 1px solid #ddd; border-radius: 3px; -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05); box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05); From 9d3451b31dd118266d47d8f0449d0dd10a5d0cff Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 5 Dec 2015 19:31:32 +0100 Subject: [PATCH 133/206] NEW Add thumb of users into thumbs stats on home page --- .../class/expensereport.class.php | 1 - htdocs/index.php | 73 +++++++++++-------- htdocs/user/class/user.class.php | 36 +++++++++ 3 files changed, 77 insertions(+), 33 deletions(-) diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index 8b79d0b5d9f..3063bcde35f 100644 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -1503,7 +1503,6 @@ class ExpenseReport extends CommonObject $this->error=$this->db->error(); return -1; } - } /** diff --git a/htdocs/index.php b/htdocs/index.php index 1c99fb0c647..c932aad6234 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2013 Laurent Destailleur + * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2005-2015 Regis Houssin * Copyright (C) 2011-2012 Juanjo Menent * Copyright (C) 2015 Marcos García @@ -146,6 +146,7 @@ if (empty($user->societe_id)) { // Condition to be checked for each display line dashboard $conditions=array( + $user->rights->user->user->lire, ! empty($conf->societe->enabled) && $user->rights->societe->lire && empty($conf->global->SOCIETE_DISABLE_CUSTOMERS_STATS), ! empty($conf->societe->enabled) && $user->rights->societe->lire && empty($conf->global->SOCIETE_DISABLE_PROSPECTS_STATS), ! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->lire && empty($conf->global->SOCIETE_DISABLE_SUPPLIERS_STATS), @@ -160,21 +161,24 @@ if (empty($user->societe_id)) ! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->facture->lire, ! empty($conf->expensereport->enabled) && $user->rights->expensereport->lire); // Class file containing the method load_state_board for each line - $includes=array(DOL_DOCUMENT_ROOT."/societe/class/client.class.php", - DOL_DOCUMENT_ROOT."/societe/class/client.class.php", - DOL_DOCUMENT_ROOT."/fourn/class/fournisseur.class.php", - DOL_DOCUMENT_ROOT."/adherents/class/adherent.class.php", - DOL_DOCUMENT_ROOT."/product/class/product.class.php", - DOL_DOCUMENT_ROOT."/product/class/service.class.php", - DOL_DOCUMENT_ROOT."/comm/propal/class/propal.class.php", - DOL_DOCUMENT_ROOT."/commande/class/commande.class.php", - DOL_DOCUMENT_ROOT."/compta/facture/class/facture.class.php", - DOL_DOCUMENT_ROOT."/contrat/class/contrat.class.php", - DOL_DOCUMENT_ROOT."/fourn/class/fournisseur.commande.class.php", - DOL_DOCUMENT_ROOT."/fourn/class/fournisseur.facture.class.php", - DOL_DOCUMENT_ROOT."/expensereport/class/expensereport.class.php"); + $includes=array( + DOL_DOCUMENT_ROOT."/user/class/user.class.php", + DOL_DOCUMENT_ROOT."/societe/class/client.class.php", + DOL_DOCUMENT_ROOT."/societe/class/client.class.php", + DOL_DOCUMENT_ROOT."/fourn/class/fournisseur.class.php", + DOL_DOCUMENT_ROOT."/adherents/class/adherent.class.php", + DOL_DOCUMENT_ROOT."/product/class/product.class.php", + DOL_DOCUMENT_ROOT."/product/class/service.class.php", + DOL_DOCUMENT_ROOT."/comm/propal/class/propal.class.php", + DOL_DOCUMENT_ROOT."/commande/class/commande.class.php", + DOL_DOCUMENT_ROOT."/compta/facture/class/facture.class.php", + DOL_DOCUMENT_ROOT."/contrat/class/contrat.class.php", + DOL_DOCUMENT_ROOT."/fourn/class/fournisseur.commande.class.php", + DOL_DOCUMENT_ROOT."/fourn/class/fournisseur.facture.class.php", + DOL_DOCUMENT_ROOT."/expensereport/class/expensereport.class.php"); // Name class containing the method load_state_board for each line - $classes=array('Client', + $classes=array('User', + 'Client', 'Client', 'Fournisseur', 'Adherent', @@ -188,7 +192,8 @@ if (empty($user->societe_id)) 'FactureFournisseur', 'ExpenseReport'); // Cle array returned by the method load_state_board for each line - $keys=array('customers', + $keys=array('users', + 'customers', 'prospects', 'suppliers', 'members', @@ -202,7 +207,8 @@ if (empty($user->societe_id)) 'supplier_invoices', 'expensereports'); // Dashboard Icon lines - $icons=array('company', + $icons=array('user', + 'company', 'company', 'company', 'user', @@ -216,7 +222,8 @@ if (empty($user->societe_id)) 'bill', 'trip'); // Translation keyword - $titres=array("ThirdPartyCustomersStats", + $titres=array("Users", + "ThirdPartyCustomersStats", "ThirdPartyProspectsStats", "Suppliers", "Members", @@ -231,21 +238,23 @@ if (empty($user->societe_id)) "ExpenseReports"); // Dashboard Link lines $links=array( - DOL_URL_ROOT.'/societe/list.php?type=c', - DOL_URL_ROOT.'/societe/list.php?type=p', - DOL_URL_ROOT.'/societe/list.php?type=f', - DOL_URL_ROOT.'/adherents/list.php?statut=1&mainmenu=members', - DOL_URL_ROOT.'/product/list.php?type=0&mainmenu=products', - DOL_URL_ROOT.'/product/list.php?type=1&mainmenu=products', - DOL_URL_ROOT.'/comm/propal/list.php?mainmenu=commercial', - DOL_URL_ROOT.'/commande/list.php?mainmenu=commercial', - DOL_URL_ROOT.'/compta/facture/list.php?mainmenu=accountancy', - DOL_URL_ROOT.'/contrat/list.php', - DOL_URL_ROOT.'/fourn/commande/list.php', - DOL_URL_ROOT.'/fourn/facture/list.php', - DOL_URL_ROOT.'/expensereport/list.php?mainmenu=hrm'); + DOL_URL_ROOT.'/user/list.php', + DOL_URL_ROOT.'/societe/list.php?type=c', + DOL_URL_ROOT.'/societe/list.php?type=p', + DOL_URL_ROOT.'/societe/list.php?type=f', + DOL_URL_ROOT.'/adherents/list.php?statut=1&mainmenu=members', + DOL_URL_ROOT.'/product/list.php?type=0&mainmenu=products', + DOL_URL_ROOT.'/product/list.php?type=1&mainmenu=products', + DOL_URL_ROOT.'/comm/propal/list.php?mainmenu=commercial', + DOL_URL_ROOT.'/commande/list.php?mainmenu=commercial', + DOL_URL_ROOT.'/compta/facture/list.php?mainmenu=accountancy', + DOL_URL_ROOT.'/contrat/list.php', + DOL_URL_ROOT.'/fourn/commande/list.php', + DOL_URL_ROOT.'/fourn/facture/list.php', + DOL_URL_ROOT.'/expensereport/list.php?mainmenu=hrm'); // Translation lang files - $langfile=array("companies", + $langfile=array("users", + "companies", "prospects", "suppliers", "members", diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 06e8250a870..27c2a7d63ce 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2578,5 +2578,41 @@ class User extends CommonObject return CommonObject::commonReplaceThirdparty($db, $origin_id, $dest_id, $tables); } + + + /** + * Charge indicateurs this->nb pour le tableau de bord + * + * @return int <0 if KO, >0 if OK + */ + function load_state_board() + { + global $conf; + + $this->nb=array(); + + $sql = "SELECT count(u.rowid) as nb"; + $sql.= " FROM ".MAIN_DB_PREFIX."user as u"; + $sql.= " WHERE u.statut > 0"; + $sql.= " AND u.entity IN (".getEntity('user', 1).")"; + + $resql=$this->db->query($sql); + if ($resql) + { + while ($obj=$this->db->fetch_object($resql)) + { + $this->nb["users"]=$obj->nb; + } + $this->db->free($resql); + return 1; + } + else + { + dol_print_error($this->db); + $this->error=$this->db->error(); + return -1; + } + } + } From 497c30d994c83c410f37cfed5a190655b5c41b02 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 5 Dec 2015 19:38:45 +0100 Subject: [PATCH 134/206] NEW Add thumb of users into thumbs stats on home page --- htdocs/index.php | 2 +- htdocs/user/class/user.class.php | 1 + htdocs/user/index.php | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/index.php b/htdocs/index.php index c932aad6234..94445337720 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -238,7 +238,7 @@ if (empty($user->societe_id)) "ExpenseReports"); // Dashboard Link lines $links=array( - DOL_URL_ROOT.'/user/list.php', + DOL_URL_ROOT.'/user/index.php', DOL_URL_ROOT.'/societe/list.php?type=c', DOL_URL_ROOT.'/societe/list.php?type=p', DOL_URL_ROOT.'/societe/list.php?type=f', diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 27c2a7d63ce..955753a73a3 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2594,6 +2594,7 @@ class User extends CommonObject $sql = "SELECT count(u.rowid) as nb"; $sql.= " FROM ".MAIN_DB_PREFIX."user as u"; $sql.= " WHERE u.statut > 0"; + //$sql.= " AND employee != 0"; $sql.= " AND u.entity IN (".getEntity('user', 1).")"; $resql=$this->db->query($sql); diff --git a/htdocs/user/index.php b/htdocs/user/index.php index ce597483d76..c4e769d6ffd 100644 --- a/htdocs/user/index.php +++ b/htdocs/user/index.php @@ -191,7 +191,7 @@ else { $sql.= " WHERE u.entity IN (".getEntity('user',1).")"; } -if ($mode = "employee") $sql.= " AND u.employee = 1"; +if ($mode == "employee") $sql.= " AND u.employee = 1"; if ($socid > 0) $sql.= " AND u.fk_soc = ".$socid; //if ($search_user != '') $sql.=natural_search(array('u.login', 'u.lastname', 'u.firstname'), $search_user); if ($search_supervisor > 0) $sql.= " AND u.fk_user = ".$search_supervisor; From 27c7e3cb7e89c7ec97bfbf92719ca584da6dfa00 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 5 Dec 2015 23:45:08 +0100 Subject: [PATCH 135/206] Try to solve mysql pb with new travis --- .travis.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1769f2f0504..2a2cde4ee0f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -76,20 +76,20 @@ before_script: # (https://github.com/piwik/piwik/commit/20bd2e1c24e5d673dce3feb256204ad48c29f160) # TODO: Remove when mysql 5.6 is provided by travis. # Otherwise, our migrations will raise a syntax error. - - "sudo apt-get remove mysql-common mysql-server-5.5 mysql-server-core-5.5 mysql-client-5.5 mysql-client-core-5.5" - - "sudo apt-get autoremove" - - "sudo apt-get install libaio1" - - "wget -O mysql-5.6.14.deb http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.14-debian6.0-x86_64.deb/from/http://cdn.mysql.com/" - - "sudo dpkg -i mysql-5.6.14.deb" - - "sudo cp /opt/mysql/server-5.6/support-files/mysql.server /etc/init.d/mysql.server" - - "sudo ln -s /opt/mysql/server-5.6/bin/* /usr/bin/" - - "sudo sed -i'' 's/table_cache/table_open_cache/' /etc/mysql/my.cnf" - - "sudo sed -i'' 's/log_slow_queries/slow_query_log/' /etc/mysql/my.cnf" - - "sudo sed -i'' 's/basedir[^=]\\+=.*$/basedir = \\/opt\\/mysql\\/server-5.6/' /etc/mysql/my.cnf" - - "sudo /etc/init.d/mysql.server start" +# - "sudo apt-get remove mysql-common mysql-server-5.5 mysql-server-core-5.5 mysql-client-5.5 mysql-client-core-5.5" +# - "sudo apt-get autoremove" +# - "sudo apt-get install libaio1" +# - "wget -O mysql-5.6.14.deb http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.14-debian6.0-x86_64.deb/from/http://cdn.mysql.com/" +# - "sudo dpkg -i mysql-5.6.14.deb" +# - "sudo cp /opt/mysql/server-5.6/support-files/mysql.server /etc/init.d/mysql.server" +# - "sudo ln -s /opt/mysql/server-5.6/bin/* /usr/bin/" +# - "sudo sed -i'' 's/table_cache/table_open_cache/' /etc/mysql/my.cnf" +# - "sudo sed -i'' 's/log_slow_queries/slow_query_log/' /etc/mysql/my.cnf" +# - "sudo sed -i'' 's/basedir[^=]\\+=.*$/basedir = \\/opt\\/mysql\\/server-5.6/' /etc/mysql/my.cnf" +# - "sudo /etc/init.d/mysql.server start" + # /END MYSQL 5.6- mysql --version - mysql --version - mysql -e "SELECT VERSION();" - # /END MYSQL 5.6- mysql --version - echo Init database - sh -c "if [ '$DB' = 'pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS myapp_test;' -U postgres; fi" - sh -c "if [ '$DB' = 'pgsql' ]; then psql -c 'CREATE DATABASE myapp_test;' -U postgres; fi" From 3fb7a9429b8d06e404d7faee625a176d114d61a6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 5 Dec 2015 23:55:10 +0100 Subject: [PATCH 136/206] No more need to install mysql 5.6 --- .travis.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2a2cde4ee0f..9956d9c58c8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,6 @@ services: # This will tell travis to run phpunit language: php php: -# - "5.2" is not supported because pyrus to install PHP_Codesniffer is not available - 5.3 - 5.4 - 5.5 @@ -51,9 +50,9 @@ before_script: - composer install - phpenv rehash - htdocs/includes/squizlabs/php_codesniffer/scripts/phpcs --version + - htdocs/includes/squizlabs/php_codesniffer/scripts/phpcs -i # - which phpcs # - phpcs --version - - htdocs/includes/squizlabs/php_codesniffer/scripts/phpcs -i # - phpcs -i - echo Create dir $(pwd)/htdocs/documents - sudo mkdir -p $(pwd)/htdocs/documents/admin/temp; @@ -72,10 +71,10 @@ before_script: - sh -c "if [ '$PHPV' = '5.4' ]; then echo 'zend_extension_ts = xdebug.so' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini; fi" - cat ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini - echo Mysql version - # INSTALL MYSQL 5.6 - # (https://github.com/piwik/piwik/commit/20bd2e1c24e5d673dce3feb256204ad48c29f160) - # TODO: Remove when mysql 5.6 is provided by travis. - # Otherwise, our migrations will raise a syntax error. +# INSTALL MYSQL 5.6 +# (https://github.com/piwik/piwik/commit/20bd2e1c24e5d673dce3feb256204ad48c29f160) +# TODO: Remove when mysql 5.6 is provided by travis. +# Otherwise, our migrations will raise a syntax error. # - "sudo apt-get remove mysql-common mysql-server-5.5 mysql-server-core-5.5 mysql-client-5.5 mysql-client-core-5.5" # - "sudo apt-get autoremove" # - "sudo apt-get install libaio1" @@ -87,7 +86,7 @@ before_script: # - "sudo sed -i'' 's/log_slow_queries/slow_query_log/' /etc/mysql/my.cnf" # - "sudo sed -i'' 's/basedir[^=]\\+=.*$/basedir = \\/opt\\/mysql\\/server-5.6/' /etc/mysql/my.cnf" # - "sudo /etc/init.d/mysql.server start" - # /END MYSQL 5.6- mysql --version +# /END MYSQL 5.6- mysql --version - mysql --version - mysql -e "SELECT VERSION();" - echo Init database From 374480043e96b5900b4dde4b420d385f6b45a09c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 6 Dec 2015 00:37:58 +0100 Subject: [PATCH 137/206] Add maxwidth300 on combo list for users and sale representatives --- htdocs/adherents/card.php | 2 +- htdocs/adherents/stats/index.php | 2 +- htdocs/admin/prelevement.php | 2 +- htdocs/bookmarks/card.php | 4 +- htdocs/comm/action/card.php | 2 +- htdocs/comm/action/document.php | 2 +- htdocs/comm/propal/stats/index.php | 2 +- htdocs/commande/stats/index.php | 3 +- htdocs/compta/deplacement/card.php | 4 +- htdocs/compta/deplacement/stats/index.php | 2 +- htdocs/compta/facture/mergepdftool.php | 4 +- htdocs/compta/facture/stats/index.php | 2 +- htdocs/compta/salaries/card.php | 2 +- htdocs/contact/card.php | 62 +------------------ htdocs/contrat/list.php | 2 +- htdocs/core/lib/agenda.lib.php | 2 +- htdocs/don/stats/index.php | 2 +- htdocs/expedition/stats/index.php | 2 +- htdocs/expensereport/list.php | 2 +- htdocs/expensereport/stats/index.php | 2 +- htdocs/holiday/card.php | 2 +- htdocs/holiday/define_holiday.php | 2 +- htdocs/margin/agentMargins.php | 2 +- htdocs/projet/tasks.php | 2 +- .../canvas/actions_card_common.class.php | 2 +- htdocs/societe/list.php | 2 +- htdocs/supplier_proposal/list.php | 4 +- htdocs/theme/eldy/style.css.php | 6 +- htdocs/theme/md/style.css.php | 6 +- htdocs/user/card.php | 4 +- htdocs/user/group/card.php | 2 +- 31 files changed, 43 insertions(+), 98 deletions(-) diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php index 503eddfbbb7..f17ca46299f 100644 --- a/htdocs/adherents/card.php +++ b/htdocs/adherents/card.php @@ -936,7 +936,7 @@ else // Login Dolibarr print ''.$langs->trans("LinkedToDolibarrUser").''; - print $form->select_dolusers($object->user_id,'userid',1); + print $form->select_dolusers($object->user_id, 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print ''; */ print ''; diff --git a/htdocs/adherents/stats/index.php b/htdocs/adherents/stats/index.php index 43b994adafe..dc5bf732103 100644 --- a/htdocs/adherents/stats/index.php +++ b/htdocs/adherents/stats/index.php @@ -155,7 +155,7 @@ $filter='s.client in (1,2,3)'; print $form->select_company($id,'memberid',$filter,1); print ''; print ''.$langs->trans("User").''; -print $form->select_dolusers($userid,'userid',1); +print $form->select_dolusers($userid, 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print ''; print ''; print ''; diff --git a/htdocs/admin/prelevement.php b/htdocs/admin/prelevement.php index f2d8c2d84dc..1a3fd19aa1c 100644 --- a/htdocs/admin/prelevement.php +++ b/htdocs/admin/prelevement.php @@ -135,7 +135,7 @@ print ""; print ''.$langs->trans("ResponsibleUser").''; print ''; print ''; -print $form->select_dolusers($conf->global->PRELEVEMENT_USER,'value0',1); +print $form->select_dolusers($conf->global->PRELEVEMENT_USER, 'value0', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print ''; print ''; diff --git a/htdocs/bookmarks/card.php b/htdocs/bookmarks/card.php index 62b4ccddce6..c7f47649efa 100644 --- a/htdocs/bookmarks/card.php +++ b/htdocs/bookmarks/card.php @@ -165,7 +165,7 @@ if ($action == 'create') print ''.$langs->trans("ChooseIfANewWindowMustBeOpenedOnClickOnBookmark").''; print ''.$langs->trans("Owner").''; - print $form->select_dolusers(isset($_POST['userid'])?$_POST['userid']:$user->id,'userid',1); + print $form->select_dolusers(isset($_POST['userid'])?$_POST['userid']:$user->id, 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print ' '; // Position @@ -262,7 +262,7 @@ if ($id > 0 && ! preg_match('/^add/i',$action)) print ''.$langs->trans("Owner").''; if ($action == 'edit' && $user->admin) { - print $form->select_dolusers(isset($_POST['userid'])?$_POST['userid']:($bookmark->fk_user?$bookmark->fk_user:''),'userid',1); + print $form->select_dolusers(isset($_POST['userid'])?$_POST['userid']:($bookmark->fk_user?$bookmark->fk_user:''), 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); } else { diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index 84a36dec8b9..0f561622bd1 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -1247,7 +1247,7 @@ if ($id > 0) } } print '
'; - print $form->select_dolusers_forevent('view','assignedtouser',1); + print $form->select_dolusers_forevent('view', 'assignedtouser', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print '
'; if (in_array($user->id,array_keys($listofuserid))) { diff --git a/htdocs/comm/action/document.php b/htdocs/comm/action/document.php index f3bda0281da..992c2314446 100644 --- a/htdocs/comm/action/document.php +++ b/htdocs/comm/action/document.php @@ -196,7 +196,7 @@ if ($object->id > 0) } } print '
'; - print $form->select_dolusers_forevent('view','assignedtouser',1); + print $form->select_dolusers_forevent('view', 'assignedtouser', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print '
'; if (in_array($user->id,array_keys($listofuserid))) { diff --git a/htdocs/comm/propal/stats/index.php b/htdocs/comm/propal/stats/index.php index 5b45020b7e1..f757a224266 100644 --- a/htdocs/comm/propal/stats/index.php +++ b/htdocs/comm/propal/stats/index.php @@ -243,7 +243,7 @@ print '
'; print ''; // User print ''.$langs->trans("CreatedBy").''; - print $form->select_dolusers($userid,'userid',1); + print $form->select_dolusers($userid, 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print ''; // Status print ''.$langs->trans("Status").''; diff --git a/htdocs/commande/stats/index.php b/htdocs/commande/stats/index.php index 04cfad1732d..a6e04121707 100644 --- a/htdocs/commande/stats/index.php +++ b/htdocs/commande/stats/index.php @@ -260,8 +260,7 @@ print '
'; print ''; // User print ''.$langs->trans("CreatedBy").''; - print $form->select_dolusers($userid,'userid',1); - print ''; + print $form->select_dolusers($userid, 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); // Year print ''.$langs->trans("Year").''; if (! in_array($year,$arrayyears)) $arrayyears[$year]=$year; diff --git a/htdocs/compta/deplacement/card.php b/htdocs/compta/deplacement/card.php index f2fcd490277..903977da460 100644 --- a/htdocs/compta/deplacement/card.php +++ b/htdocs/compta/deplacement/card.php @@ -257,7 +257,7 @@ if ($action == 'create') print ""; print ''.$langs->trans("Person").''; - print $form->select_dolusers(GETPOST('fk_user','int'),'fk_user',1); + print $form->select_dolusers(GETPOST('fk_user','int'), 'fk_user', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print ''; print ""; @@ -353,7 +353,7 @@ else if ($id) // Who print ""; print ''.$langs->trans("Person").''; - print $form->select_dolusers(GETPOST('fk_user','int')?GETPOST('fk_user','int'):$object->fk_user,'fk_user',0); + print $form->select_dolusers(GETPOST('fk_user','int')?GETPOST('fk_user','int'):$object->fk_user, 'fk_user', 0, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print ''; // Date diff --git a/htdocs/compta/deplacement/stats/index.php b/htdocs/compta/deplacement/stats/index.php index 1d9f7b70201..531c05401ab 100644 --- a/htdocs/compta/deplacement/stats/index.php +++ b/htdocs/compta/deplacement/stats/index.php @@ -242,7 +242,7 @@ print ''; print ''.$langs->trans("User").''; $include=''; if (empty($user->rights->deplacement->readall) && empty($user->rights->deplacement->lire_tous)) $include='hierarchy'; -print $form->select_dolusers($userid,'userid',1,'',0,$include); +print $form->select_dolusers($userid, 'userid', 1, '', 0, $include, '', 0, 0, 0, '', 0, '', 'maxwidth300'); print ''; // Year print ''.$langs->trans("Year").''; diff --git a/htdocs/compta/facture/mergepdftool.php b/htdocs/compta/facture/mergepdftool.php index f79621a4d87..64a823e8e4a 100644 --- a/htdocs/compta/facture/mergepdftool.php +++ b/htdocs/compta/facture/mergepdftool.php @@ -637,7 +637,7 @@ if ($resql) $langs->load("commercial"); $moreforfilter.='
'; $moreforfilter.=$langs->trans('ThirdPartiesOfSaleRepresentative'). ': '; - $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user); + $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user, 0, 1, 'maxwidth300'); $moreforfilter.='
'; } // If the user can view prospects other than his' @@ -645,7 +645,7 @@ if ($resql) { $moreforfilter.='
'; $moreforfilter.=$langs->trans('LinkedToSpecificUsers'). ': '; - $moreforfilter.=$form->select_dolusers($search_user,'search_user',1); + $moreforfilter.=$form->select_dolusers($search_user, 'search_user', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); $moreforfilter.='
'; } if (! empty($moreforfilter)) diff --git a/htdocs/compta/facture/stats/index.php b/htdocs/compta/facture/stats/index.php index 2b7e17d9369..bfe3cdc8555 100644 --- a/htdocs/compta/facture/stats/index.php +++ b/htdocs/compta/facture/stats/index.php @@ -244,7 +244,7 @@ print '
'; print ''; // User print ''.$langs->trans("CreatedBy").''; - print $form->select_dolusers($userid,'userid',1); + print $form->select_dolusers($userid, 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print ''; // Year print ''.$langs->trans("Year").''; diff --git a/htdocs/compta/salaries/card.php b/htdocs/compta/salaries/card.php index 4b5b0edd784..0e8e69b8353 100644 --- a/htdocs/compta/salaries/card.php +++ b/htdocs/compta/salaries/card.php @@ -250,7 +250,7 @@ if ($action == 'create') // Employee print ''; print fieldLabel('Employee','fk_user',1).''; - print $form->select_dolusers(GETPOST('fk_user','int'),'fk_user',1); + print $form->select_dolusers(GETPOST('fk_user','int'), 'fk_user', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print ''; // Label diff --git a/htdocs/contact/card.php b/htdocs/contact/card.php index 8022c17de67..1da57afc2f6 100644 --- a/htdocs/contact/card.php +++ b/htdocs/contact/card.php @@ -1055,17 +1055,6 @@ else print '
'; print ''; - - // Ref - /*print ''; - - // Name - print ''; - print ''; - */ - // Company if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) { @@ -1082,20 +1071,6 @@ else print ''; } - // Photo - /* - if ($object->photo) - { - print ''; - } else { - print ''; - } - */ - print ''; // Civility @@ -1106,46 +1081,11 @@ else // Role print ''; - // Address - /* - print ''; - - // Zip/Town - print ''; - - // Country - print ''; - - // State - if (empty($conf->global->SOCIETE_DISABLE_STATE)) - { - print ''; - }*/ - - // Phone - /* - print ''; - print ''; - - print ''; - print ''; - */ - // Email - //print ''; if (! empty($conf->mailing->enabled)) { $langs->load("mails"); - print ''; + print ''; print ''; } diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index dbf5803a4c6..ef226d35908 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -178,7 +178,7 @@ if ($resql) $langs->load("commercial"); $moreforfilter.='
'; $moreforfilter.=$langs->trans('ThirdPartiesOfSaleRepresentative'). ': '; - $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user); + $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user,0,1,'maxwidth300'); $moreforfilter.='
'; } // If the user can view other users diff --git a/htdocs/core/lib/agenda.lib.php b/htdocs/core/lib/agenda.lib.php index 42244a11718..165c93fa9a1 100644 --- a/htdocs/core/lib/agenda.lib.php +++ b/htdocs/core/lib/agenda.lib.php @@ -75,7 +75,7 @@ function print_actions_filter($form, $canedit, $status, $year, $month, $day, $sh print ''; diff --git a/htdocs/don/stats/index.php b/htdocs/don/stats/index.php index c5cd34caf5f..bf773fcab62 100644 --- a/htdocs/don/stats/index.php +++ b/htdocs/don/stats/index.php @@ -244,7 +244,7 @@ print '
'; print ''; // User print '
'; // Year print ''; // User print ''; // Year print ''; } else { print ''; diff --git a/htdocs/expensereport/stats/index.php b/htdocs/expensereport/stats/index.php index d64cbca648f..80965deebfa 100644 --- a/htdocs/expensereport/stats/index.php +++ b/htdocs/expensereport/stats/index.php @@ -224,7 +224,7 @@ print ''; print ''; // Year print ''; print ''; + print ''; print '
'.$langs->trans("Ref").''; - print $form->showrefnav($object, 'id', $linkback); - print '
'.$langs->trans("Lastname").' / '.$langs->trans("Label").''.$object->lastname.''.$langs->trans("Firstname").''.$object->firstname.''; - print $form->showphoto('contact',$object); - print ''; - print ' '; - print '
'.$langs->trans("PostOrFunction").''.$object->poste.'
'.$langs->trans("Address").''; - dol_print_address($object->address,'gmap','contact',$object->id); - print '
'.$langs->trans("Zip").' / '.$langs->trans("Town").''; - print $object->zip; - if ($object->zip) print ' '; - print $object->town.'
'.$langs->trans("Country").''; - $img=picto_from_langcode($object->country_code); - if ($img) print $img.' '; - print $object->country; - print '
'.$langs->trans('State').''.$object->state.'
'.$langs->trans("PhonePro").''.dol_print_phone($object->phone_pro,$object->country_code,$object->id,$object->socid,'AC_TEL').''.$langs->trans("PhonePerso").''.dol_print_phone($object->phone_perso,$object->country_code,$object->id,$object->socid,'AC_TEL').'
'.$langs->trans("PhoneMobile").''.dol_print_phone($object->phone_mobile,$object->country_code,$object->id,$object->socid,'AC_TEL').''.$langs->trans("Fax").''.dol_print_phone($object->fax,$object->country_code,$object->id,$object->socid,'AC_FAX').'
'.$langs->trans("EMail").''.dol_print_email($object->email,$object->id,$object->socid,'AC_EMAIL').'
'.$langs->trans("NbOfEMailingsSend").'
'.$langs->trans("NbOfEMailingsSend").''.$object->getNbOfEMailings().'
'; print $langs->trans("ActionsToDoBy").'   '; print ''; - print $form->select_dolusers($filtert, 'usertodo', 1, '', ! $canedit); + print $form->select_dolusers($filtert, 'usertodo', 1, '', ! $canedit, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); if (empty($conf->dol_optimize_smallscreen)) print '   '.$langs->trans("or") . ' '.$langs->trans("Group").'   '; print $form->select_dolgroups($usergroupid, 'usergroup', 1, '', ! $canedit); print '
'.$langs->trans("CreatedBy").''; - print $form->select_dolusers($userid,'userid',1); + print $form->select_dolusers($userid, 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print '
'.$langs->trans("Year").''; diff --git a/htdocs/expedition/stats/index.php b/htdocs/expedition/stats/index.php index 76755360869..f0f5198bee5 100644 --- a/htdocs/expedition/stats/index.php +++ b/htdocs/expedition/stats/index.php @@ -243,7 +243,7 @@ print '
'; print '
'.$langs->trans("CreatedBy").''; - print $form->select_dolusers($userid,'userid',1); + print $form->select_dolusers($userid, 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print '
'.$langs->trans("Year").''; diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index c59a594b5a6..78edcea53b0 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -247,7 +247,7 @@ if ($resql) // User if ($user->rights->expensereport->readall || $user->rights->expensereport->lire_tous){ print ''; - print $form->select_dolusers($search_user,"search_user",1,"",0,''); + print $form->select_dolusers($search_user, 'search_user', 1, '' 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print ' 
'.$langs->trans("User").''; $include=''; if (empty($user->rights->expensereport->readall) && empty($user->rights->expensereport->lire_tous)) $include='hierarchy'; -print $form->select_dolusers($userid,'userid',1,'',0,$include); +print $form->select_dolusers($userid, 'userid', 1, '', 0, $include, '', 0, 0, 0, '', 0, '', 'maxwidth300'); print '
'.$langs->trans("Year").''; diff --git a/htdocs/holiday/card.php b/htdocs/holiday/card.php index 8a576250e79..7802e0c32fa 100644 --- a/htdocs/holiday/card.php +++ b/htdocs/holiday/card.php @@ -795,7 +795,7 @@ if (empty($id) || $action == 'add' || $action == 'request' || $action == 'create print ''; if (empty($user->rights->holiday->write_all)) { - print $form->select_dolusers($userid,'useridbis',0,'',1); + print $form->select_dolusers($userid, 'useridbis', 0, '', 1, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print ''; } else print $form->select_dolusers(GETPOST('userid')?GETPOST('userid'):$user->id,'userid',0,'',0); diff --git a/htdocs/holiday/define_holiday.php b/htdocs/holiday/define_holiday.php index 62ad088a5ef..afd5c1a05d4 100644 --- a/htdocs/holiday/define_holiday.php +++ b/htdocs/holiday/define_holiday.php @@ -178,7 +178,7 @@ if ($cp_events == 1) print $langs->trans('MotifCP').' : '; print $holiday->selectEventCP(); print '   '.$langs->trans('UserCP').' : '; - print $form->select_dolusers('',"userCP",1,"",0,''); + print $form->select_dolusers('', 'userCP', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print ' '; print '
'; diff --git a/htdocs/margin/agentMargins.php b/htdocs/margin/agentMargins.php index 83ed0ccfc0f..f9189ed7e97 100644 --- a/htdocs/margin/agentMargins.php +++ b/htdocs/margin/agentMargins.php @@ -94,7 +94,7 @@ print ''; if ($user->rights->margins->read->all) { print ''; print ''; } diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index 63c2bd72f28..eb95fd33624 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -307,7 +307,7 @@ if ($action == 'create' && $user->rights->projet->creer && (empty($object->third $contactsofproject=(! empty($object->id)?$object->getListContactId('internal'):''); if (count($contactsofproject)) { - print $form->select_dolusers($user->id,'userid',0,'',0,'',$contactsofproject); + print $form->select_dolusers($user->id, 'userid', 0, '', 0, '', $contactsofproject, 0, 0, 0, '', 0, '', 'maxwidth300'); } else { diff --git a/htdocs/societe/canvas/actions_card_common.class.php b/htdocs/societe/canvas/actions_card_common.class.php index bffff8f3cbe..0dd71b42baa 100644 --- a/htdocs/societe/canvas/actions_card_common.class.php +++ b/htdocs/societe/canvas/actions_card_common.class.php @@ -510,7 +510,7 @@ abstract class ActionsCardCommon $this->tpl['yn_assujtva'] = $form->selectyesno('assujtva_value',$this->tpl['tva_assuj'],1); // Assujeti par defaut en creation // Select users - $this->tpl['select_users'] = $form->select_dolusers($this->object->commercial_id,'commercial_id',1); + $this->tpl['select_users'] = $form->select_dolusers($this->object->commercial_id, 'commercial_id', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); // Local Tax // TODO mettre dans une classe propre au pays diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index ef64761ab6f..0b373ba9d5d 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -514,7 +514,7 @@ if ($resql) { $moreforfilter.='
'; $moreforfilter.=$langs->trans('SalesRepresentatives'). ': '; - $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user); + $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user, 0, 1, 'maxwidth300'); $moreforfilter.='
'; } } diff --git a/htdocs/supplier_proposal/list.php b/htdocs/supplier_proposal/list.php index a1f66e832f0..6aad541c1f9 100644 --- a/htdocs/supplier_proposal/list.php +++ b/htdocs/supplier_proposal/list.php @@ -273,7 +273,7 @@ if ($result) $langs->load("commercial"); $moreforfilter.='
'; $moreforfilter.=$langs->trans('ThirdPartiesOfSaleRepresentative'). ': '; - $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user); + $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user, 0, 1, 'maxwidth300'); $moreforfilter.='
'; } // If the user can view prospects other than his' @@ -281,7 +281,7 @@ if ($result) { $moreforfilter.='
'; $moreforfilter.=$langs->trans('LinkedToSpecificUsers'). ': '; - $moreforfilter.=$form->select_dolusers($search_user,'search_user',1); + $moreforfilter.=$form->select_dolusers($search_user, 'search_user', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); $moreforfilter.='
'; } if (! empty($moreforfilter)) diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index bb00659f171..66d62959e43 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -1612,7 +1612,9 @@ div.tabsAction { padding: 0em 0em; text-align: right; } - +div.tabsAction > a { + margin-bottom: 16px !important; +} a.tabTitle { /* background: #657090; @@ -2364,7 +2366,7 @@ tr.even td, tr.pair td, tr.odd td, tr.impair td, form.odd div.tagtd, form.impair tr.even td, tr.pair td, tr.odd td, tr.impair td, form.odd div.tagtd, form.impair div.tagtd, form.pair div.tagtd, div.impair div.tagtd, div.pair div.tagtd, div.liste_titre div.tagtd { border-bottom: 1px solid #ddd; } -tr.even:last-child td, tr.pair:last-child td, tr.odd:last-child td, tr.impair:last-child td { +tr.even:last-of-type td, tr.pair:last-of-type td, tr.odd:last-of-type td, tr.impair:last-of-type td { border-bottom: 0px !important; } tr.even td .nobordernopadding tr td, tr.pair td .nobordernopadding tr td, tr.impair td .nobordernopadding tr td, tr.odd td .nobordernopadding tr td { diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 13b2e4df171..9839959bfb8 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1592,6 +1592,10 @@ div.tabsAction { padding: 0em 0em; text-align: right; } +div.tabsAction > a { + margin-bottom: 16px !important; +} + div.popuptabset { padding: 6px; border: 1px solid #888; @@ -2187,7 +2191,7 @@ tr.even td, tr.pair td, tr.odd td, tr.impair td, form.odd div.tagtd, form.impair padding: 5px 2px 5px 3px; border-bottom: 1px solid #eee; } -tr.even:last-child td, tr.pair:last-child td, tr.odd:last-child td, tr.impair:last-child td { +tr.even:last-of-type td, tr.pair:last-of-type td, tr.odd:last-of-type td, tr.impair:last-of-type td { border-bottom: 0px !important; } tr.even td .nobordernopadding tr td, tr.pair td .nobordernopadding tr td, tr.impair td .nobordernopadding tr td, tr.odd td .nobordernopadding tr td { diff --git a/htdocs/user/card.php b/htdocs/user/card.php index c7d745a2c94..9fbd9d20aa7 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1007,7 +1007,7 @@ if (($action == 'create') || ($action == 'adduserldap')) // Hierarchy print ''; print ''; print "\n"; @@ -2107,7 +2107,7 @@ else print '"; -echo "
'.$langs->trans('SalesRepresentative').''; - print $form->select_dolusers($agentid, 'agentid', 1); + print $form->select_dolusers($agentid, 'agentid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print '
'.$langs->trans("HierarchicalResponsible").''; - print $form->select_dolusers($object->fk_user,'fk_user',1,array($object->id),0,'',0,$conf->entity); + print $form->select_dolusers($object->fk_user, 'fk_user', 1, array($object->id), 0, '', 0, $conf->entity, 0, 0, '', 0, '', 'maxwidth300'); print '
'; if ($caneditfield) { - print $form->select_dolusers($object->fk_user,'fk_user',1,array($object->id),0,'',0,$object->entity); + print $form->select_dolusers($object->fk_user, 'fk_user', 1, array($object->id), 0, '', 0, $object->entity, 0, 0, '', 0, '', 'maxwidth300'); } else { diff --git a/htdocs/user/group/card.php b/htdocs/user/group/card.php index 4edb037d8d6..39aca6f2bf4 100644 --- a/htdocs/user/group/card.php +++ b/htdocs/user/group/card.php @@ -398,7 +398,7 @@ else print ''."\n"; print ''."\n"; print ''; - //print ''; } - print '
'.$langs->trans("NonAffectedUsers").''; - print $form->select_dolusers('','user',1,$exclude,0,'','',$object->entity); + print $form->select_dolusers('', 'user', 1, $exclude, 0, '', '', $object->entity, 0, 0, '', 0, '', 'maxwidth300'); print '   '; // Multicompany if (! empty($conf->multicompany->enabled) && is_object($mc)) From 745875d21e8487cf8b192702ee875e192283b242 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 6 Dec 2015 01:19:27 +0100 Subject: [PATCH 138/206] NEW Can choose fields to show on project list --- htdocs/projet/list.php | 431 ++++++++++++++++++++++++++--------------- htdocs/user/index.php | 4 +- 2 files changed, 274 insertions(+), 161 deletions(-) diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index 2475074d941..d0a1ac2c599 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -33,6 +33,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; $langs->load('projects'); +$langs->load('companies'); +$langs->load('commercial'); $title = $langs->trans("Projects"); @@ -107,17 +109,17 @@ if (empty($user->socid)) $fieldstosearchall["p.note_private"]="NotePrivate"; $arrayfields=array( 'p.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), - 'p.label'=>array('label'=>$langs->trans("Label"), 'checked'=>1), + 'p.title'=>array('label'=>$langs->trans("Label"), 'checked'=>1), 's.nom'=>array('label'=>$langs->trans("ThirdParty"), 'checked'=>1), - 'commerical'=>array('label'=>$langs->trans("SaleRepresentative"), 'checked'=>1), - 'p.date_start'=>array('label'=>$langs->trans("DateStart"), 'checked'=>1, 'position'=>100), - 'p.date_end'=>array('label'=>$langs->trans("DateEnd"), 'checked'=>1, 'position'=>101), - 'p.visibility'=>array('label'=>$langs->trans("Visibility"), 'checked'=>1, 'position'=>102), - 'p.opportunity_amount'=>array('label'=>$langs->trans("OpportunityAmount"), 'checked'=>1, 'enabled'=>$conf->global->PROJECT_USE_OPPORTUNITIES, 'position'=>103), - 'p.opportunity_status'=>array('label'=>$langs->trans("OpportunityStatus"), 'checked'=>1, 'enabled'=>$conf->global->PROJECT_USE_OPPORTUNITIES, 'position'=>104), + 'commercial'=>array('label'=>$langs->trans("SalesRepresentative"), 'checked'=>1), + 'p.dateo'=>array('label'=>$langs->trans("DateStart"), 'checked'=>1, 'position'=>100), + 'p.datee'=>array('label'=>$langs->trans("DateEnd"), 'checked'=>1, 'position'=>101), + 'p.public'=>array('label'=>$langs->trans("Visibility"), 'checked'=>1, 'position'=>102), + 'p.opp_amount'=>array('label'=>$langs->trans("OpportunityAmount"), 'checked'=>1, 'enabled'=>$conf->global->PROJECT_USE_OPPORTUNITIES, 'position'=>103), + 'p.fk_opp_status'=>array('label'=>$langs->trans("OpportunityStatus"), 'checked'=>1, 'enabled'=>$conf->global->PROJECT_USE_OPPORTUNITIES, 'position'=>104), 'p.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), 'p.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), - 'p.status'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000), + 'p.statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000), ); // Extra fields if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) @@ -175,7 +177,7 @@ llxHeader("",$langs->trans("Projects"),"EN:Module_Projects|FR:Module_Projets|ES: $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,($mine?$mine:($user->rights->projet->all->lire?2:0)),1,$socid); $sql = "SELECT p.rowid as projectid, p.ref, p.title, p.fk_statut, p.fk_opp_status, p.public, p.fk_user_creat"; -$sql.= ", p.datec as date_create, p.dateo as date_start, p.datee as date_end, p.opp_amount"; +$sql.= ", p.datec as date_creation, p.dateo as date_start, p.datee as date_end, p.opp_amount, p.tms as date_update"; $sql.= ", s.nom as name, s.rowid as socid"; $sql.= ", cls.code as opp_status_code"; // Add fields for extrafields @@ -260,7 +262,7 @@ if ($resql) $i = 0; $param=''; - if ($mine) $param.='&mode=mine'; + //if ($mine) $param.='&mode=mine'; if ($month) $param.='&month='.$month; if ($year) $param.='&year=' .$year; if ($socid) $param.='&socid='.$socid; @@ -274,22 +276,29 @@ if ($resql) if ($search_user > 0) $param.='&search_user='.$search_user; if ($search_sale > 0) $param.='&search_sale='.$search_sale; if ($optioncss != '') $param.='&optioncss='.$optioncss; - - + // Add $param from extra fields + foreach ($search_array_options as $key => $val) + { + $crit=$val; + $tmpkey=preg_replace('/search_options_/','',$key); + if ($val != '') $param.='&search_options_'.$tmpkey.'='.urlencode($val); + } + $text=$langs->trans("Projects"); - if ($mine) $text=$langs->trans('MyProjects'); + if ($search_user == $user->id) $text=$langs->trans('MyProjects'); print_barre_liste($text, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, "", $num,'','title_project'); - print '
'; + print ''; if ($optioncss != '') print ''; print ''; + print ''; print ''; print ''; print ''; print ''; // Show description of content - if ($mine) print $langs->trans("MyProjectsDesc").'

'; + if ($search_user == $user->id) print $langs->trans("MyProjectsDesc").'

'; else { if ($user->rights->projet->all->lire && ! $socid) print $langs->trans("ProjectsDesc").'

'; @@ -302,6 +311,7 @@ if ($resql) print $langs->trans("FilterOnInto", $search_all) . join(', ',$fieldstosearchall); } + $colspan=8; if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) $colspan+=2; if (empty($conf->global->PROJECT_LIST_HIDE_STARTDATE)) $colspan++; @@ -328,52 +338,76 @@ if ($resql) if (! empty($moreforfilter)) { print '
'; - //print '
'; print $moreforfilter; $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; print ''; - //print '
'; + $varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; + $selectedfields=$form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields + + print '
'; print ''; - print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"],"p.ref","",$param,"",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Label"),$_SERVER["PHP_SELF"],"p.title","",$param,"",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("ThirdParty"),$_SERVER["PHP_SELF"],"s.nom","",$param,"",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("SalesRepresentative"),$_SERVER["PHP_SELF"],"","",$param,"",$sortfield,$sortorder); - if (empty($conf->global->PROJECT_LIST_HIDE_STARTDATE)) print_liste_field_titre($langs->trans("DateStart"),$_SERVER["PHP_SELF"],"p.dateo","",$param,'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("DateEnd"),$_SERVER["PHP_SELF"],"p.datee","",$param,'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Visibility"),$_SERVER["PHP_SELF"],"p.public","",$param,"",$sortfield,$sortorder); - if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) - { - print_liste_field_titre($langs->trans("OpportunityAmountShort"),$_SERVER["PHP_SELF"],'p.opp_amount',"",$param,'align="right"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("OpportunityStatusShort"),$_SERVER["PHP_SELF"],'p.fk_opp_status',"",$param,'align="center"',$sortfield,$sortorder); - } - $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],'p.fk_statut',"",$param,'align="right"',$sortfield,$sortorder); - print_liste_field_titre('',$_SERVER["PHP_SELF"],"",'','','',$sortfield,$sortorder,'maxwidthsearch '); + if (! empty($arrayfields['p.ref']['checked'])) print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"],"p.ref","",$param,"",$sortfield,$sortorder); + if (! empty($arrayfields['p.title']['checked'])) print_liste_field_titre($langs->trans("Label"),$_SERVER["PHP_SELF"],"p.title","",$param,"",$sortfield,$sortorder); + if (! empty($arrayfields['s.nom']['checked'])) print_liste_field_titre($langs->trans("ThirdParty"),$_SERVER["PHP_SELF"],"s.nom","",$param,"",$sortfield,$sortorder); + if (! empty($arrayfields['commercial']['checked'])) print_liste_field_titre($langs->trans("SalesRepresentative"),$_SERVER["PHP_SELF"],"","",$param,"",$sortfield,$sortorder); + if (! empty($arrayfields['p.dateo']['checked'])) print_liste_field_titre($langs->trans("DateStart"),$_SERVER["PHP_SELF"],"p.dateo","",$param,'align="center"',$sortfield,$sortorder); + if (! empty($arrayfields['p.datee']['checked'])) print_liste_field_titre($langs->trans("DateEnd"),$_SERVER["PHP_SELF"],"p.datee","",$param,'align="center"',$sortfield,$sortorder); + if (! empty($arrayfields['p.public']['checked'])) print_liste_field_titre($langs->trans("Visibility"),$_SERVER["PHP_SELF"],"p.public","",$param,"",$sortfield,$sortorder); + if (! empty($arrayfields['p.opp_amount']['checked'])) print_liste_field_titre($langs->trans("OpportunityAmountShort"),$_SERVER["PHP_SELF"],'p.opp_amount',"",$param,'align="right"',$sortfield,$sortorder); + if (! empty($arrayfields['p.fk_opp_status']['checked'])) print_liste_field_titre($langs->trans("OpportunityStatusShort"),$_SERVER["PHP_SELF"],'p.fk_opp_status',"",$param,'align="center"',$sortfield,$sortorder); + // Extra fields + if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) + { + foreach($extrafields->attribute_label as $key => $val) + { + if (! empty($arrayfields["ef.".$key]['checked'])) + { + $align=$extrafields->getAlignFlag($key); + print_liste_field_titre($extralabels[$key],$_SERVER["PHP_SELF"],"ef.".$key,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); + } + } + } + // Hook fields + $parameters=array('arrayfields'=>$arrayfields); + $reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + if (! empty($arrayfields['p.datec']['checked'])) print_liste_field_titre($langs->trans("DateCreationShort"),$_SERVER["PHP_SELF"],"p.datec","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); + if (! empty($arrayfields['p.tms']['checked'])) print_liste_field_titre($langs->trans("DateModificationShort"),$_SERVER["PHP_SELF"],"p.tms","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); + if (! empty($arrayfields['p.statut']['checked'])) print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],"p.fk_statut","",$param,'align="center"',$sortfield,$sortorder); + print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"],"",'','','align="right"',$sortfield,$sortorder,'maxwidthsearch '); print "\n"; print ''; - print ''; - print ''; - print ''; + if (! empty($arrayfields['p.ref']['checked'])) + { + print ''; + } + if (! empty($arrayfields['p.title']['checked'])) + { + print ''; + } + if (! empty($arrayfields['s.nom']['checked'])) + { + print ''; + } // Sale representative - print ''; + if (! empty($arrayfields['commercial']['checked'])) + { + print ''; + } // Start date - if (empty($conf->global->PROJECT_LIST_HIDE_STARTDATE)) + if (! empty($arrayfields['p.dateo']['checked'])) { print ''; } // End date - print ''; - - print ''; - - $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldListOption',$parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - - if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) - { + if (! empty($arrayfields['p.datee']['checked'])) + { + print ''; + } + if (! empty($arrayfields['p.public']['checked'])) + { + print ''; + } + if (! empty($arrayfields['p.opp_amount']['checked'])) + { print ''; + } + if (! empty($arrayfields['p.fk_opp_status']['checked'])) + { print ''; } - - print ''; - print ''; + // Extra fields + if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) + { + foreach($extrafields->attribute_label as $key => $val) + { + if (! empty($arrayfields["ef.".$key]['checked'])) print ''; + } + } + // Fields from hook + $parameters=array('arrayfields'=>$arrayfields); + $reshook=$hookmanager->executeHooks('printFieldListOption',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + if (! empty($arrayfields['p.datec']['checked'])) + { + // Date creation + print ''; + } + if (! empty($arrayfields['p.tms']['checked'])) + { + // Date modification + print ''; + } + if (! empty($arrayfields['p.statut']['checked'])) + { + print ''; + } + // Action column + print ''; print ''."\n"; while ($i < $num) { - $objp = $db->fetch_object($resql); + $obj = $db->fetch_object($resql); - $projectstatic->id = $objp->projectid; - $projectstatic->user_author_id = $objp->fk_user_creat; - $projectstatic->public = $objp->public; + $projectstatic->id = $obj->projectid; + $projectstatic->user_author_id = $obj->fk_user_creat; + $projectstatic->public = $obj->public; $userAccess = $projectstatic->restrictedProjectArea($user); @@ -433,104 +497,151 @@ if ($resql) print ""; // Project url - print ''; - + if (! empty($arrayfields['p.ref']['checked'])) + { + print ''; + } // Title - print ''; - + if (! empty($arrayfields['p.title']['checked'])) + { + print ''; + } // Company - print ''; - - + if (! empty($arrayfields['s.nom']['checked'])) + { + print ''; + } // Sales Rapresentatives - print ''; - + if (! empty($arrayfields['commercial']['checked'])) + { + print ''; + } // Date start - if (empty($conf->global->PROJECT_LIST_HIDE_STARTDATE)) - { + if (! empty($arrayfields['p.dateo']['checked'])) + { print ''; } - // Date end - print ''; - + if (! empty($arrayfields['p.datee']['checked'])) + { + print ''; + } // Visibility - print ''; - - $parameters=array('obj' => $objp); - $reshook=$hookmanager->executeHooks('printFieldListValue',$parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - - if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) - { + if (! empty($arrayfields['p.public']['checked'])) + { + print ''; + } + if (! empty($arrayfields['p.opp_amount']['checked'])) + { print ''; - - print ''; } - + // Extra fields + if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) + { + foreach($extrafields->attribute_label as $key => $val) + { + if (! empty($arrayfields["ef.".$key]['checked'])) + { + print 'getAlignFlag($key); + if ($align) print ' align="'.$align.'"'; + print '>'; + $tmpkey='options_'.$key; + print $extrafields->showOutputField($key, $obj->$tmpkey, '', 1); + print ''; + } + } + } + // Fields from hook + $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $reshook=$hookmanager->executeHooks('printFieldListValue',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (! empty($arrayfields['p.datec']['checked'])) + { + print ''; + } + // Date modification + if (! empty($arrayfields['p.tms']['checked'])) + { + print ''; + } // Status - $projectstatic->statut = $objp->fk_statut; - print ''; - + if (! empty($arrayfields['p.statut']['checked'])) + { + $projectstatic->statut = $obj->fk_statut; + print ''; + } + // Action column print ''; print "\n"; diff --git a/htdocs/user/index.php b/htdocs/user/index.php index c4e769d6ffd..43812be515c 100644 --- a/htdocs/user/index.php +++ b/htdocs/user/index.php @@ -266,10 +266,12 @@ if ($result) print $langs->trans("FilterOnInto", $sall) . join(', ',$fieldstosearchall); } + $moreforfilter=''; + $varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; $selectedfields=$form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields - print '
'; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print '  '; if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; @@ -382,48 +416,78 @@ if ($resql) print ''; - if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; - print ''; - $formother->select_year($year?$year:-1,'year',1, 20, 5); - print ''; - $array=array(''=>'',0 => $langs->trans("PrivateProject"),1 => $langs->trans("SharedProject")); - print $form->selectarray('search_public',$array,$search_public); - print ''; + if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; + print ''; + $formother->select_year($year?$year:-1,'year',1, 20, 5); + print ''; + $array=array(''=>'',0 => $langs->trans("PrivateProject"),1 => $langs->trans("SharedProject")); + print $form->selectarray('search_public',$array,$search_public); + print ''; print ''; print $formproject->selectOpportunityStatus('search_opp_status',$search_opp_status,1,1,1); print ''; - print $form->selectarray('search_status', array('-1'=>'', '0'=>$langs->trans('Draft'),'1'=>$langs->trans('Opened'),'2'=>$langs->trans('Closed')),$search_status); - print ''; - print ''; - print ''; - print ''; + print ''; + print ''; + print $form->selectarray('search_status', array('-1'=>'', '0'=>$langs->trans('Draft'),'1'=>$langs->trans('Opened'),'2'=>$langs->trans('Closed')),$search_status); + print ''; + print ''; + print ''; + print '
'; - $projectstatic->ref = $objp->ref; - print $projectstatic->getNomUrl(1); - print ''; + $projectstatic->ref = $obj->ref; + print $projectstatic->getNomUrl(1); + print ''; - print dol_trunc($objp->title,80); - print ''; + print dol_trunc($obj->title,80); + print ''; - if ($objp->socid) - { - $socstatic->id=$objp->socid; - $socstatic->name=$objp->name; - print $socstatic->getNomUrl(1); - } - else - { - print ' '; - } - print ''; + if ($obj->socid) + { + $socstatic->id=$obj->socid; + $socstatic->name=$obj->name; + print $socstatic->getNomUrl(1); + } + else + { + print ' '; + } + print ''; - if($objp->socid) - { - $listsalesrepresentatives=$socstatic->getSalesRepresentatives($user); - $nbofsalesrepresentative=count($listsalesrepresentatives); - if ($nbofsalesrepresentative > 3) // We print only number - { - print ''; - print $nbofsalesrepresentative; - print ''; - } - else if ($nbofsalesrepresentative > 0) - { - $userstatic=new User($db); - $j=0; - foreach($listsalesrepresentatives as $val) - { - $userstatic->id=$val['id']; - $userstatic->lastname=$val['lastname']; - $userstatic->firstname=$val['firstname']; - $userstatic->email=$val['email']; - print $userstatic->getNomUrl(1); - $j++; - if ($j < $nbofsalesrepresentative) print ', '; - } - } - //else print $langs->trans("NoSalesRepresentativeAffected"); - } - else - { - print ' '; - } - print ''; + if ($obj->socid) + { + $socstatic->id=$obj->socid; + $socstatic->name=$obj->name; + $listsalesrepresentatives=$socstatic->getSalesRepresentatives($user); + $nbofsalesrepresentative=count($listsalesrepresentatives); + if ($nbofsalesrepresentative > 3) // We print only number + { + print ''; + print $nbofsalesrepresentative; + print ''; + } + else if ($nbofsalesrepresentative > 0) + { + $userstatic=new User($db); + $j=0; + foreach($listsalesrepresentatives as $val) + { + $userstatic->id=$val['id']; + $userstatic->lastname=$val['lastname']; + $userstatic->firstname=$val['firstname']; + $userstatic->email=$val['email']; + print $userstatic->getNomUrl(1); + $j++; + if ($j < $nbofsalesrepresentative) print ', '; + } + } + //else print $langs->trans("NoSalesRepresentativeAffected"); + } + else + { + print ' '; + } + print ''; - print dol_print_date($db->jdate($objp->date_start),'day'); + print dol_print_date($db->jdate($obj->date_start),'day'); print ''; - print dol_print_date($db->jdate($objp->date_end),'day'); - print ''; + print dol_print_date($db->jdate($obj->date_end),'day'); + print ''; - if ($objp->public) print $langs->trans('SharedProject'); - else print $langs->trans('PrivateProject'); - print ''; + if ($obj->public) print $langs->trans('SharedProject'); + else print $langs->trans('PrivateProject'); + print ''; - if ($objp->opp_status_code) print price($objp->opp_amount, 1, '', 1, - 1, - 1, $conf->currency); + if ($obj->opp_status_code) print price($obj->opp_amount, 1, '', 1, - 1, - 1, $conf->currency); print ''; - if ($objp->opp_status_code) print $langs->trans("OppStatusShort".$objp->opp_status_code); + } + if (! empty($arrayfields['p.fk_opp_status']['checked'])) + { + print ''; + if ($obj->opp_status_code) print $langs->trans("OppStatusShort".$obj->opp_status_code); print ''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour'); + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour'); + print ''.$projectstatic->getLibStatut(5).''.$projectstatic->getLibStatut(5).'
'; + print '
'; print ''; if (! empty($arrayfields['u.login']['checked'])) print_liste_field_titre($langs->trans("Login"),$_SERVER['PHP_SELF'],"u.login",$param,"","",$sortfield,$sortorder); if (! empty($arrayfields['u.lastname']['checked'])) print_liste_field_titre($langs->trans("Lastname"),$_SERVER['PHP_SELF'],"u.lastname",$param,"","",$sortfield,$sortorder); From 50cf96bd1638d33a76abc01cac5727cdac3ec2fb Mon Sep 17 00:00:00 2001 From: AlainRnet Date: Sun, 6 Dec 2015 12:01:59 +0100 Subject: [PATCH 139/206] Update const.php link to help file --- htdocs/admin/const.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/admin/const.php b/htdocs/admin/const.php index 06e3279fa54..5749fbbb4fb 100644 --- a/htdocs/admin/const.php +++ b/htdocs/admin/const.php @@ -146,7 +146,8 @@ if ($action == 'delete') $form = new Form($db); -llxHeader('',$langs->trans("OtherSetup")); +$wikihelp='EN:Setup_Other|FR:Paramétrage_Divers|ES:Configuración_Varios'; +llxHeader('',$langs->trans("Setup"),$wikihelp); // Add logic to show/hide buttons if ($conf->use_javascript_ajax) From 0279e99b0a8b7018cbb37876b382e2acba010793 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 6 Dec 2015 12:04:34 +0100 Subject: [PATCH 140/206] Update warning for mysql 5.5.4* bug --- ChangeLog | 3 ++- htdocs/langs/en_US/install.lang | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9cb28633bfd..09e216e93fc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,7 +6,8 @@ WARNING: Do not try to make any Dolibarr upgrade if you are running Mysql version 5.5.40. Mysql version 5.5.40 has a very critical bug making your data beeing definitely lost. -You may also experience troubles with Mysql 5.5.41 with error "Lost connection" during migration. +You may also experience troubles with Mysql 5.5.41/42/43 with error "Lost connection" +during migration. Upgrading to any other version or any other database system is abolutely required BEFORE trying make a Dolibarr upgrade. diff --git a/htdocs/langs/en_US/install.lang b/htdocs/langs/en_US/install.lang index 6ec3ca2d14a..f21af4e072e 100644 --- a/htdocs/langs/en_US/install.lang +++ b/htdocs/langs/en_US/install.lang @@ -155,7 +155,7 @@ MigrationFinished=Migration finished LastStepDesc=Last step: Define here login and password you plan to use to connect to software. Do not loose this as it is the account to administer all others. ActivateModule=Activate module %s ShowEditTechnicalParameters=Click here to show/edit advanced parameters (expert mode) -WarningUpgrade=Warning:\nDid your run a database backup first ?\nThis is highly recommanded: for example, due to some bugs into databases systems (for example mysql version 5.5.40), some data or tables may be lost during this process, so it is highly recommanded to have a complete dump of your database before starting migration.\n\nClick OK to start migration process... +WarningUpgrade=Warning:\nDid your run a database backup first ?\nThis is highly recommanded: for example, due to some bugs into databases systems (for example mysql version 5.5.40/41/42/43), some data or tables may be lost during this process, so it is highly recommanded to have a complete dump of your database before starting migration.\n\nClick OK to start migration process... ErrorDatabaseVersionForbiddenForMigration=Your database version is %s. It has a critical bug making data loss if you make structure change on your database, like it is required by the migration process. For his reason, migration will not be allowed until you upgrade your database to a higher fixed version (list of known bugged version: %s) ######### From d4268c079f8040eb5e9121cee228a36691d8d546 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 6 Dec 2015 12:23:49 +0100 Subject: [PATCH 141/206] Fix syntax error --- htdocs/expensereport/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index 78edcea53b0..502125faf61 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -247,7 +247,7 @@ if ($resql) // User if ($user->rights->expensereport->readall || $user->rights->expensereport->lire_tous){ print ''; } else { print ''; From 7f3531a04c621aa2ee94c94a9e56d0572669b778 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 6 Dec 2015 13:34:57 +0100 Subject: [PATCH 142/206] Enhance script to track duplicate translation string and use it to remove around 50 duplicates. --- dev/translation/sanity_check_en_langfiles.php | 279 ++++++++++++------ htdocs/compta/facture.php | 2 +- .../core/triggers/dolibarrtriggers.class.php | 4 +- htdocs/install/fileconf.php | 6 +- htdocs/langs/en_US/accountancy.lang | 20 +- htdocs/langs/en_US/admin.lang | 8 - htdocs/langs/en_US/bills.lang | 4 - htdocs/langs/en_US/companies.lang | 1 - htdocs/langs/en_US/compta.lang | 2 - htdocs/langs/en_US/ecm.lang | 1 - htdocs/langs/en_US/errors.lang | 2 - htdocs/langs/en_US/hrm.lang | 1 - htdocs/langs/en_US/install.lang | 7 - htdocs/langs/en_US/main.lang | 3 +- htdocs/langs/en_US/members.lang | 1 - htdocs/langs/en_US/orders.lang | 1 - htdocs/langs/en_US/other.lang | 14 +- htdocs/langs/en_US/products.lang | 2 - htdocs/langs/en_US/projects.lang | 1 - htdocs/langs/en_US/supplier_proposal.lang | 1 - htdocs/langs/en_US/trips.lang | 2 - htdocs/langs/en_US/users.lang | 1 - htdocs/langs/en_US/withdrawals.lang | 1 - htdocs/product/admin/product.php | 5 +- 24 files changed, 205 insertions(+), 164 deletions(-) mode change 100644 => 100755 dev/translation/sanity_check_en_langfiles.php diff --git a/dev/translation/sanity_check_en_langfiles.php b/dev/translation/sanity_check_en_langfiles.php old mode 100644 new mode 100755 index a3b3911c77f..f54c179ac09 --- a/dev/translation/sanity_check_en_langfiles.php +++ b/dev/translation/sanity_check_en_langfiles.php @@ -1,82 +1,102 @@ +#!/usr/bin/php -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ +/* Copyright (c) 2015 Tommaso Basilici + * Copyright (c) 2015 Laurent Destailleur + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ -echo ""; -echo ""; +$sapi_type = php_sapi_name(); +$script_file = basename(__FILE__); +$path=dirname(__FILE__).'/'; -echo ""; + + echo ""; } -tr:nth-child(odd) td { - background-color: #f1f1f1; -} +echo "If you call this file with the argument \"?unused=true\" it searches for the translation strings that exist in en_US but are never used.\n"; +if ($web) print "
"; +echo "IMPORTANT: that can take quite a lot of time (up to 10 minutes), you need to tune the max_execution_time on your php.ini accordingly.\n"; +if ($web) print "
"; -"; - -echo ""; - -echo "If you call this file with the argument \"?unused=true\" it searches for the translation strings that exist in en_US but are never used.
"; -echo "IMPORTANT: that can take quite a lot of time (up to 10 minutes), you need to tune the max_execution_time on your php.ini accordingly.
"; -echo "Happy translating :)
"; // STEP 1 - Search duplicates keys // directory containing the php and lang files -$htdocs = "../../htdocs/"; +$htdocs = $path."/../../htdocs/"; // directory containing the english lang files $workdir = $htdocs."langs/en_US/"; @@ -114,8 +134,10 @@ foreach ($files AS $file) { } } -foreach ($langstrings_3d AS $filename => $file) { - foreach ($file AS $linenum => $value) { +foreach ($langstrings_3d AS $filename => $file) +{ + foreach ($file AS $linenum => $value) + { $keys = array_keys($langstrings_full, $value); if (count($keys)>1) { @@ -126,30 +148,95 @@ foreach ($langstrings_3d AS $filename => $file) { } } -echo "

Duplicate strings in lang files in $workdir - ".count($dups)." found

"; +if ($web) print "

"; +print "Duplicate strings in lang files in $workdir - ".count($dups)." found\n"; +if ($web) print "

"; -echo "
'; - print $form->select_dolusers($search_user, 'search_user', 1, '' 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); + print $form->select_dolusers($search_user, 'search_user', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print ' 
"; -echo ""; -echo ""; -$count = 0; -foreach ($dups as $string => $pages) { - $count++; - echo ""; - echo ""; - echo ""; - echo "\n"; +if ($web) +{ + echo '
#StringFile and lines
$count$string"; - foreach ($pages AS $page => $lines ) { - echo "$page "; - foreach ($lines as $line => $translatedvalue) { - //echo "($line - ".(substr($translatedvalue,0,20)).") "; - echo "($line - ".htmlentities($translatedvalue).") "; - } - echo "
"; - } - echo "
'."\n"; + echo "\n"; + echo "\n"; +} + +$sduplicateinsamefile=''; +$sinmainandother=''; +$sininstallandadmin=''; +$sother=''; + +$count = 0; +foreach ($dups as $string => $pages) +{ + $count++; + $s=''; + + // Keyword $string + if ($web) $s.=""; + if ($web) $s.=""; + if ($web) $s.=""; + if ($web) $s.=""; + $s.="\n"; + + if ($duplicateinsamefile) $sduplicateinsamefile .= $s; + else if ($inmain) $sinmainandother .= $s; + else if ($inadmin) $sininstallandadmin .= $s; + else $sother .= $s; +} + +if (! $web) print "\n***** Entries duplicated in same file\n"; +print $sduplicateinsamefile; +if (! $web && empty($sduplicateinsamefile)) print "None\n"; +if (! $web) print "\n"; + +if (! $web) print "***** Entries in main and another (keep only entry in main)\n"; +print $sinmainandother; +if (! $web && empty($sinmainandother)) print "None\n"; +if (! $web) print "\n"; + +if (! $web) print "***** Entries in admin and another\n"; +print $sininstallandadmin; +if (! $web && empty($sininstallandadmin)) print "None\n"; +if (! $web) print "\n"; + +if (! $web) print "***** Other\n"; +print $sother; +if (! $web && empty($sother)) print "None\n"; +if (! $web) print "\n"; + +if ($web) +{ + echo "\n"; + echo "
#StringFile and lines
"; + if ($web) $s.=$count; + if ($web) $s.=""; + $s.=$string; + if ($web) $s.=""; + if (! $web) $s.= ' : '; + + // Loop on each files keyword was found + $duplicateinsamefile=0; + $inmain=0; + $inadmin=0; + foreach ($pages AS $file => $lines) + { + if ($file == 'main.lang') { $inmain=1; $inadmin=0; } + if ($file == 'admin.lang' && ! $inmain) { $inadmin=1; } + + $s.=$file." "; + + // Loop on each line keword was found into file. + $listoffilesforthisentry=array(); + foreach ($lines as $line => $translatedvalue) + { + if (! empty($listoffilesforthisentry[$file])) $duplicateinsamefile=1; + $listoffilesforthisentry[$file]=1; + + $s.= "(".$line." - ".htmlentities($translatedvalue).") "; + } + if ($web) $s.="
"; + } + if ($web) $s.="
\n"; } -echo "
"; // STEP 2 - Search key not used @@ -168,12 +255,20 @@ if (! empty($_REQUEST['unused']) && $_REQUEST['unused'] == 'true') } } - echo "

Strings in en_US that are never used

"; - echo "
";
+	if ($web) print "

\n"; + print "Strings in en_US that are never used\n"; + if ($web) print "

\n"; + if ($web) echo "
";
 	print_r($unused);
-	echo "
"; + if ($web) echo "
\n"; } echo "\n"; -echo ""; -echo ""; +if ($web) +{ + echo "\n"; + echo "\n"; +} + +exit; + diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index d5e99af0df6..9ce11ee5abf 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -2833,7 +2833,7 @@ else if ($id > 0 || ! empty($ref)) print '
' . $langs->trans('Company') . ''; if (! empty($conf->global->FACTURE_CHANGE_THIRDPARTY) && $action != 'editthirdparty' && $object->brouillon && $user->rights->facture->creer) - print 'id . '">' . img_edit($langs->trans('SetLinkToThirdParty'), 1) . 'id . '">' . img_edit($langs->trans('SetLinkToAnotherThirdParty'), 1) . '
'; print ''; if ($action == 'editthirdparty') { diff --git a/htdocs/core/triggers/dolibarrtriggers.class.php b/htdocs/core/triggers/dolibarrtriggers.class.php index d4cffc24a01..61a89b083f8 100644 --- a/htdocs/core/triggers/dolibarrtriggers.class.php +++ b/htdocs/core/triggers/dolibarrtriggers.class.php @@ -121,9 +121,9 @@ abstract class DolibarrTriggers $langs->load("admin"); if ($this->version == self::VERSION_DEVELOPMENT) { - return $langs->trans("Development"); + return $langs->trans("VersionDevelopment"); } elseif ($this->version == self::VERSION_EXPERIMENTAL) { - return $langs->trans("Experimental"); + return $langs->trans("VersionExperimental"); } elseif ($this->version == self::VERSION_DOLIBARR) { return DOL_VERSION; } elseif ($this->version) { diff --git a/htdocs/install/fileconf.php b/htdocs/install/fileconf.php index 21e975f8b29..8d040e06ed4 100644 --- a/htdocs/install/fileconf.php +++ b/htdocs/install/fileconf.php @@ -333,9 +333,9 @@ if (! empty($force_install_message)) if ($note) $option.=' '.$note; // Deprecated and experimental if ($type=='mysql') $option.=' ' . $langs->trans("Deprecated"); - elseif ($type=='mssql') $option.=' '.$langs->trans("Experimental"); - elseif ($type=='sqlite') $option.=' '.$langs->trans("Experimental"); - elseif ($type=='sqlite3') $option.=' '.$langs->trans("Experimental"); + elseif ($type=='mssql') $option.=' '.$langs->trans("VersionExperimental"); + elseif ($type=='sqlite') $option.=' '.$langs->trans("VersionExperimental"); + elseif ($type=='sqlite3') $option.=' '.$langs->trans("VersionExperimental"); // No available elseif (! function_exists($testfunction)) $option.=' - '.$langs->trans("FunctionNotAvailableInThisPHP"); $option.=''; diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index edc0a8d512d..a9451deb151 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -1,5 +1,4 @@ # Dolibarr language file - en_US - Accounting Expert -CHARSET=UTF-8 ACCOUNTING_EXPORT_SEPARATORCSV=Column separator for export file ACCOUNTING_EXPORT_DATE=Date format for export file ACCOUNTING_EXPORT_PIECE=Export the number of piece @@ -12,8 +11,6 @@ ACCOUNTING_EXPORT_PREFIX_SPEC=Specify the prefix for the file name Accounting=Accounting Globalparameters=Global parameters -Chartofaccounts=Chart of accounts -Fiscalyear=Fiscal years Menuaccount=Accounting accounts Menuthirdpartyaccount=Thirdparty accounts MenuTools=Tools @@ -33,23 +30,17 @@ Back=Return Definechartofaccounts=Define a chart of accounts Selectchartofaccounts=Select a chart of accounts -Validate=Validate Addanaccount=Add an accounting account AccountAccounting=Accounting account AccountAccountingSuggest=Accounting account suggest Ventilation=Breakdown -ToDispatch=To dispatch -Dispatched=Dispatched CustomersVentilation=Breakdown customers SuppliersVentilation=Breakdown suppliers TradeMargin=Trade margin Reports=Reports ByCustomerInvoice=By invoices customers -ByMonth=By Month NewAccount=New accounting account -Update=Update -List=List Create=Create CreateMvts=Create movement UpdateAccount=Modification of an accounting account @@ -61,7 +52,6 @@ AccountBalanceByMonth=Account balance by month AccountingVentilation=Breakdown accounting AccountingVentilationSupplier=Breakdown accounting supplier AccountingVentilationCustomer=Breakdown accounting customer -Line=Line CAHTF=Total purchase supplier before tax InvoiceLines=Lines of invoice to be ventilated @@ -112,17 +102,12 @@ Docref=Reference Numerocompte=Account Code_tiers=Thirdparty Labelcompte=Label account -Debit=Debit -Credit=Credit -Amount=Amount Sens=Sens Codejournal=Journal DelBookKeeping=Delete the records of the general ledger -SellsJournal=Sells journal -PurchasesJournal=Purchases journal -DescSellsJournal=Sells journal +DescSellsJournal=Sales journal DescPurchasesJournal=Purchases journal BankJournal=Bank journal DescBankJournal=Bank journal including all the types of payments other than cash @@ -150,9 +135,6 @@ Pcgversion=Version of the plan Pcgtype=Class of account Pcgsubtype=Under class of account Accountparent=Root of the account -Active=Statement - -NewFiscalYear=New fiscal year DescVentilCustomer=Consult here the annual breakdown accounting of your invoices customers TotalVente=Total turnover before tax diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 232eb3e573f..5bac55fddc0 100755 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -105,7 +105,6 @@ DetailPosition=Sort number to define menu position PersonalizedMenusNotSupported=Personalized menus not supported AllMenus=All NotConfigured=Module not configured -Setup=Setup Activation=Activation Active=Active SetupShort=Setup @@ -193,15 +192,12 @@ ExportOptions=Export Options AddDropDatabase=Add DROP DATABASE command AddDropTable=Add DROP TABLE command ExportStructure=Structure -Datas=Data NameColumn=Name columns ExtendedInsert=Extended INSERT NoLockBeforeInsert=No lock commands around INSERT DelayedInsert=Delayed insert EncodeBinariesInHexa=Encode binary data in hexadecimal IgnoreDuplicateRecords=Ignore errors of duplicate records (INSERT IGNORE) -Yes=Yes -No=No AutoDetectLang=Autodetect (browser language) FeatureDisabledInDemo=Feature disabled in demo Rights=Permissions @@ -926,7 +922,6 @@ MenuCompanySetup=Company/Foundation MenuNewUser=New user MenuTopManager=Top menu manager MenuLeftManager=Left menu manager -MenuManager=Menu manager MenuSmartphoneManager=Smartphone menu manager DefaultMenuTopManager=Top menu manager DefaultMenuLeftManager=Left menu manager @@ -1110,7 +1105,6 @@ XDebugInstalled=XDebug is loaded. XCacheInstalled=XCache is loaded. AddRefInList=Display customer/supplier ref into list (select list or combobox) and most of hyperlink. Third parties will appears with name "CC12345 - SC45678 - The big company coorp", instead of "The big company coorp". FieldEdition=Edition of field %s -FixTZ=TimeZone fix FillThisOnlyIfRequired=Example: +2 (fill only if timezone offset problems are experienced) GetBarCode=Get barcode EmptyNumRefModelDesc=The code is free. This code can be modified at any time. @@ -1644,8 +1638,6 @@ OpenFiscalYear=Open fiscal year CloseFiscalYear=Close fiscal year DeleteFiscalYear=Delete fiscal year ConfirmDeleteFiscalYear=Are you sure to delete this fiscal year ? -Opened=Open -Closed=Closed AlwaysEditable=Can always be edited MAIN_APPLICATION_TITLE=Force visible name of application (warning: setting your own name here may break autofill login feature when using DoliDroid mobile application) NbMajMin=Minimum number of uppercase characters diff --git a/htdocs/langs/en_US/bills.lang b/htdocs/langs/en_US/bills.lang index a567fd4f062..db2b9ea4b62 100644 --- a/htdocs/langs/en_US/bills.lang +++ b/htdocs/langs/en_US/bills.lang @@ -59,7 +59,6 @@ PaymentBack=Payment back Payments=Payments PaymentsBack=Payments back PaidBack=Paid back -DatePayment=Payment date DeletePayment=Delete payment ConfirmDeletePayment=Are you sure you want to delete this payment ? ConfirmConvertToReduc=Do you want to convert this credit note or deposit into an absolute discount ?
The amount will so be saved among all discounts and could be used as a discount for a current or a future invoice for this customer. @@ -103,7 +102,6 @@ ConvertToReduc=Convert into future discount EnterPaymentReceivedFromCustomer=Enter payment received from customer EnterPaymentDueToCustomer=Make payment due to customer DisabledBecauseRemainderToPayIsZero=Disabled because remaining unpaid is zero -Amount=Amount PriceBase=Price base BillStatus=Invoice status BillStatusDraft=Draft (needs to be validated) @@ -187,7 +185,6 @@ ShowInvoiceReplace=Show replacing invoice ShowInvoiceAvoir=Show credit note ShowInvoiceDeposit=Show deposit invoice ShowPayment=Show payment -File=File AlreadyPaid=Already paid AlreadyPaidBack=Already paid back AlreadyPaidNoCreditNotesNoDeposits=Already paid (without credit notes and deposits) @@ -240,7 +237,6 @@ Reduction=Reduction ReductionShort=Reduc. Reductions=Reductions ReductionsShort=Reduc. -Discount=Discount Discounts=Discounts AddDiscount=Create discount AddRelativeDiscount=Create relative discount diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index 297556d6533..e31c347605e 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -56,7 +56,6 @@ ReportByCustomers=Report by customers ReportByQuarter=Report by rate CivilityCode=Civility code RegisteredOffice=Registered office -Name=Name Lastname=Last name Firstname=First name PostOrFunction=Post/Function diff --git a/htdocs/langs/en_US/compta.lang b/htdocs/langs/en_US/compta.lang index c7cbb6d0a9b..c71b18adc6f 100644 --- a/htdocs/langs/en_US/compta.lang +++ b/htdocs/langs/en_US/compta.lang @@ -79,7 +79,6 @@ ListPayment=List of payments ListOfPayments=List of payments ListOfCustomerPayments=List of customer payments ListOfSupplierPayments=List of supplier payments -DatePayment=Payment date DateStartPeriod=Date start period DateEndPeriod=Date end period NewVATPayment=New VAT payment @@ -200,7 +199,6 @@ ByProductsAndServices=By products and services RefExt=External ref ToCreateAPredefinedInvoice=To create a predefined invoice, create a standard invoice then, without validating it, click onto button "Convert to predefined invoice". LinkedOrder=Link to order -ReCalculate=Recalculate Mode1=Method 1 Mode2=Method 2 CalculationRuleDesc=To calculate total VAT, there is two methods:
Method 1 is rounding vat on each line, then summing them.
Method 2 is summing all vat on each line, then rounding result.
Final result may differs from few cents. Default mode is mode %s. diff --git a/htdocs/langs/en_US/ecm.lang b/htdocs/langs/en_US/ecm.lang index 96995adc8ac..d5d69daa7cf 100644 --- a/htdocs/langs/en_US/ecm.lang +++ b/htdocs/langs/en_US/ecm.lang @@ -1,5 +1,4 @@ # Dolibarr language file - Source file is en_US - ecm -MenuECM=Documents DocsMine=My documents DocsGenerated=Generated documents DocsElements=Elements documents diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index 858e76af447..f3efba10999 100755 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -3,8 +3,6 @@ # No errors NoErrorCommitIsDone=No error, we commit # Errors -Error=Error -Errors=Errors ErrorButCommitIsDone=Errors found but we validate despite this ErrorBadEMail=EMail %s is wrong ErrorBadUrl=Url %s is wrong diff --git a/htdocs/langs/en_US/hrm.lang b/htdocs/langs/en_US/hrm.lang index 1ea8d970a3f..1d03a8ebbf9 100644 --- a/htdocs/langs/en_US/hrm.lang +++ b/htdocs/langs/en_US/hrm.lang @@ -1,5 +1,4 @@ # Dolibarr language file - en_US - hrm -CHARSET=UTF-8 # Admin HRM_EMAIL_EXTERNAL_SERVICE=Email to prevent HRM external service Establishments=Establishments diff --git a/htdocs/langs/en_US/install.lang b/htdocs/langs/en_US/install.lang index f21af4e072e..ed692c07424 100644 --- a/htdocs/langs/en_US/install.lang +++ b/htdocs/langs/en_US/install.lang @@ -52,9 +52,7 @@ ServerPortDescription=Database server port. Keep empty if unknown. DatabaseServer=Database server DatabaseName=Database name DatabasePrefix=Database prefix table -Login=Login AdminLogin=Login for Dolibarr database owner. -Password=Password PasswordAgain=Retype password a second time AdminPassword=Password for Dolibarr database owner. CreateDatabase=Create database @@ -62,14 +60,11 @@ CreateUser=Create owner DatabaseSuperUserAccess=Database server - Superuser access CheckToCreateDatabase=Check box if database does not exist and must be created.
In this case, you must fill the login/password for superuser account at the bottom of this page. CheckToCreateUser=Check box if database owner does not exist and must be created.
In this case, you must choose its login and password and also fill the login/password for the superuser account at the bottom of this page. If this box is unchecked, owner database and its passwords must exists. -Experimental=(experimental) -Deprecated=(deprecated) DatabaseRootLoginDescription=Login of the user allowed to create new databases or new users, mandatory if your database or its owner does not already exists. KeepEmptyIfNoPassword=Leave empty if user has no password (avoid this) SaveConfigurationFile=Save values ConfigurationSaving=Saving configuration file ServerConnection=Server connection -DatabaseConnection=Database connection DatabaseCreation=Database creation UserCreation=User creation CreateDatabaseObjects=Database objects creation @@ -92,7 +87,6 @@ GoToDolibarr=Go to Dolibarr GoToSetupArea=Go to Dolibarr (setup area) MigrationNotFinished=Version of your database is not completely up to date, so you'll have to run the upgrade process again. GoToUpgradePage=Go to upgrade page again -Examples=Examples WithNoSlashAtTheEnd=Without the slash "/" at the end DirectoryRecommendation=It is recommanded to use a directory outside of your directory of your web pages. LoginAlreadyExists=Already exists @@ -113,7 +107,6 @@ Upgrade=Upgrade UpgradeDesc=Use this mode if you have replaced old Dolibarr files with files from a newer version. This will upgrade your database and data. Start=Start InstallNotAllowed=Setup not allowed by conf.php permissions -NotAvailable=Not available YouMustCreateWithPermission=You must create file %s and set write permissions on it for the web server during install process. CorrectProblemAndReloadPage=Please fix the problem and press F5 to reload page. AlreadyDone=Already migrated diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index db1cebac45d..9e27d6cb881 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -28,6 +28,7 @@ NoTranslation=No translation NoRecordFound=No record found NoError=No error Error=Error +Errors=Errors ErrorFieldRequired=Field '%s' is required ErrorFieldFormat=Field '%s' has a bad value ErrorFileDoesNotExists=File %s does not exist @@ -671,7 +672,7 @@ NewAttribute=New attribute AttributeCode=Attribute code OptionalFieldsSetup=Extra attributes setup URLPhoto=URL of photo/logo -SetLinkToThirdParty=Link to another third party +SetLinkToAnotherThirdParty=Link to another third party CreateDraft=Create draft SetToDraft=Back to draft ClickToEdit=Click to edit diff --git a/htdocs/langs/en_US/members.lang b/htdocs/langs/en_US/members.lang index daab8dcc3e5..1844a22c227 100644 --- a/htdocs/langs/en_US/members.lang +++ b/htdocs/langs/en_US/members.lang @@ -121,7 +121,6 @@ AttributeName=Attribute name String=String Text=Text Int=Int -Date=Date DateAndTime=Date and time PublicMemberCard=Member public card MemberNotOrNoMoreExpectedToSubscribe=Member not or no more expected to subscribe diff --git a/htdocs/langs/en_US/orders.lang b/htdocs/langs/en_US/orders.lang index 513fb091918..802fb02e6ef 100644 --- a/htdocs/langs/en_US/orders.lang +++ b/htdocs/langs/en_US/orders.lang @@ -64,7 +64,6 @@ SearchOrder=Search order SearchACustomerOrder=Search a customer order SearchASupplierOrder=Search a supplier order ShipProduct=Ship product -Discount=Discount CreateOrder=Create Order RefuseOrder=Refuse order ApproveOrder=Approve order diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang index d2faa9baae5..fe618aa58c4 100644 --- a/htdocs/langs/en_US/other.lang +++ b/htdocs/langs/en_US/other.lang @@ -10,27 +10,26 @@ BirthdayAlertOn= birthday alert active BirthdayAlertOff= birthday alert inactive Notify_FICHINTER_VALIDATE=Intervention validated Notify_FICHINTER_SENTBYMAIL=Intervention sent by mail -Notify_BILL_VALIDATE=Customer invoice validated -Notify_BILL_UNVALIDATE=Customer invoice unvalidated +Notify_ORDER_VALIDATE=Customer order validated +Notify_ORDER_SENTBYMAIL=Customer order sent by mail +Notify_ORDER_SUPPLIER_SENTBYMAIL=Supplier order sent by mail Notify_ORDER_SUPPLIER_VALIDATE=Supplier order recorded Notify_ORDER_SUPPLIER_APPROVE=Supplier order approved Notify_ORDER_SUPPLIER_REFUSE=Supplier order refused -Notify_ORDER_VALIDATE=Customer order validated Notify_PROPAL_VALIDATE=Customer proposal validated Notify_PROPAL_CLOSE_SIGNED=Customer propal closed signed Notify_PROPAL_CLOSE_REFUSED=Customer propal closed refused +Notify_PROPAL_SENTBYMAIL=Commercial proposal sent by mail Notify_WITHDRAW_TRANSMIT=Transmission withdrawal Notify_WITHDRAW_CREDIT=Credit withdrawal Notify_WITHDRAW_EMIT=Perform withdrawal -Notify_ORDER_SENTBYMAIL=Customer order sent by mail Notify_COMPANY_CREATE=Third party created Notify_COMPANY_SENTBYMAIL=Mails sent from third party card -Notify_PROPAL_SENTBYMAIL=Commercial proposal sent by mail +Notify_BILL_VALIDATE=Customer invoice validated +Notify_BILL_UNVALIDATE=Customer invoice unvalidated Notify_BILL_PAYED=Customer invoice payed Notify_BILL_CANCEL=Customer invoice canceled Notify_BILL_SENTBYMAIL=Customer invoice sent by mail -Notify_ORDER_SUPPLIER_VALIDATE=Supplier order validated -Notify_ORDER_SUPPLIER_SENTBYMAIL=Supplier order sent by mail Notify_BILL_SUPPLIER_VALIDATE=Supplier invoice validated Notify_BILL_SUPPLIER_PAYED=Supplier invoice payed Notify_BILL_SUPPLIER_SENTBYMAIL=Supplier invoice sent by mail @@ -138,7 +137,6 @@ VolumeUnitinch3=in³ VolumeUnitounce=ounce VolumeUnitlitre=litre VolumeUnitgallon=gallon -Size=size SizeUnitm=m SizeUnitdm=dm SizeUnitcm=cm diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang index 0d3f83d49a9..f345e59891a 100644 --- a/htdocs/langs/en_US/products.lang +++ b/htdocs/langs/en_US/products.lang @@ -106,7 +106,6 @@ AddToOtherProposals=Add to other proposals AddToMyBills=Add to my bills AddToOtherBills=Add to other bills CorrectStock=Correct stock -AddPhoto=Add photo ListOfStockMovements=List of stock movements BuyingPrice=Buying price PriceForEachProduct=Products with specific prices @@ -139,7 +138,6 @@ KeywordFilter=Keyword filter CategoryFilter=Category filter ProductToAddSearch=Search product to add AddDel=Add/Delete -Quantity=Quantity NoMatchFound=No match found ProductAssociationList=List of products/services that are component of this virtual product/package ProductParentList=List of package products/services with this product as a component diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index c82d651a01d..4bb6a52af8b 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -99,7 +99,6 @@ ReOpenAProject=Open project ConfirmReOpenAProject=Are you sure you want to re-open this project ? ProjectContact=Project contacts ActionsOnProject=Events on project -OpenedProjects=Opened projects YouAreNotContactOfProject=You are not a contact of this private project DeleteATimeSpent=Delete time spent ConfirmDeleteATimeSpent=Are you sure you want to delete this time spent ? diff --git a/htdocs/langs/en_US/supplier_proposal.lang b/htdocs/langs/en_US/supplier_proposal.lang index 7bd743881c1..c90b7abeba2 100644 --- a/htdocs/langs/en_US/supplier_proposal.lang +++ b/htdocs/langs/en_US/supplier_proposal.lang @@ -11,7 +11,6 @@ DraftRequests=Draft requests LastModifiedRequests=Last %s modified price requests RequestsOpened=Open price requests SupplierProposalArea=Supplier proposals area -SupplierProposal=Supplier proposal SupplierProposalShort=Supplier proposal SupplierProposals=Supplier proposals NewAskPrice=New price request diff --git a/htdocs/langs/en_US/trips.lang b/htdocs/langs/en_US/trips.lang index c6f4f316a04..ccf89b73c79 100644 --- a/htdocs/langs/en_US/trips.lang +++ b/htdocs/langs/en_US/trips.lang @@ -53,8 +53,6 @@ AddLineMini=Add Date_DEBUT=Period date start Date_FIN=Period date end ModePaiement=Payment mode -Note=Note -Project=Project VALIDATOR=User responsible for approval VALIDOR=Approved by diff --git a/htdocs/langs/en_US/users.lang b/htdocs/langs/en_US/users.lang index 81e1d48d46c..c202fa13002 100644 --- a/htdocs/langs/en_US/users.lang +++ b/htdocs/langs/en_US/users.lang @@ -41,7 +41,6 @@ SearchAUser=Search a user LoginNotDefined=Login is not defined. NameNotDefined=Name is not defined. ListOfUsers=List of users -Administrator=Administrator SuperAdministrator=Super Administrator SuperAdministratorDesc=Global administrator AdministratorDesc=Administrator diff --git a/htdocs/langs/en_US/withdrawals.lang b/htdocs/langs/en_US/withdrawals.lang index 47b8863cf25..8248042d10c 100644 --- a/htdocs/langs/en_US/withdrawals.lang +++ b/htdocs/langs/en_US/withdrawals.lang @@ -48,7 +48,6 @@ RefusedReason=Reason for rejection RefusedInvoicing=Billing the rejection NoInvoiceRefused=Do not charge the rejection InvoiceRefused=Invoice refused (Charge the rejection to customer) -Status=Status StatusUnknown=Unknown StatusWaiting=Waiting StatusTrans=Sent diff --git a/htdocs/product/admin/product.php b/htdocs/product/admin/product.php index 9c979862933..b3d17646db5 100644 --- a/htdocs/product/admin/product.php +++ b/htdocs/product/admin/product.php @@ -51,8 +51,9 @@ $select_pricing_rules=array( ); if ($conf->global->MAIN_FEATURES_LEVEL >= 2) { - $select_pricing_rules['PRODUIT_CUSTOMER_PRICES_BY_QTY'] = $langs->trans('PriceByQuantity').' ('.$langs->trans("Experimental").')'; // TODO If this is enabled, price must be hidden when price by qty is enabled, also price for quantity must be used when adding product into order/propal/invoice - $select_pricing_rules['PRODUIT_CUSTOMER_PRICES_BY_QTY&PRODUIT_MULTIPRICES'] = $langs->trans('MultiPricesAbility') . '+' . $langs->trans('PriceByQuantity').' ('.$langs->trans("Experimental").')'; + $langs->load("admin"); + $select_pricing_rules['PRODUIT_CUSTOMER_PRICES_BY_QTY'] = $langs->trans('PriceByQuantity').' ('.$langs->trans("VersionExperimental").')'; // TODO If this is enabled, price must be hidden when price by qty is enabled, also price for quantity must be used when adding product into order/propal/invoice + $select_pricing_rules['PRODUIT_CUSTOMER_PRICES_BY_QTY&PRODUIT_MULTIPRICES'] = $langs->trans('MultiPricesAbility') . '+' . $langs->trans('PriceByQuantity').' ('.$langs->trans("VersionExperimental").')'; } // Clean param From 9c227d154e846a192c68902f00f12fe0cd79e08a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 6 Dec 2015 13:37:48 +0100 Subject: [PATCH 143/206] Clean duplicate translation key --- htdocs/langs/en_US/admin.lang | 2 -- htdocs/langs/en_US/main.lang | 3 +++ htdocs/langs/en_US/trips.lang | 2 -- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 5bac55fddc0..2df962ee15f 100755 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1529,8 +1529,6 @@ DetailLevel=Level (-1:top menu, 0:header menu, >0 menu and sub menu) ModifMenu=Menu change DeleteMenu=Delete menu entry ConfirmDeleteMenu=Are you sure you want to delete menu entry %s ? -DeleteLine=Delete line -ConfirmDeleteLine=Are you sure you want to delete this line ? FailedToInitializeMenu=Failed to initialize menu ##### Tax ##### TaxSetup=Taxes, social or fiscal taxes and dividends module setup diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 9e27d6cb881..3593c844add 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -724,6 +724,9 @@ ViewList=List view Mandatory=Mandatory Hello=Hello Sincerely=Sincerely +DeleteLine=Delete line +ConfirmDeleteLine=Are you sure you want to delete this line ? + # Week day Monday=Monday Tuesday=Tuesday diff --git a/htdocs/langs/en_US/trips.lang b/htdocs/langs/en_US/trips.lang index ccf89b73c79..b0c2014a104 100644 --- a/htdocs/langs/en_US/trips.lang +++ b/htdocs/langs/en_US/trips.lang @@ -28,8 +28,6 @@ AnyOtherInThisListCanValidate=Person to inform for validation. TripSociete=Information company TripSalarie=Informations user TripNDF=Informations expense report -DeleteLine=Delete a line of the expense report -ConfirmDeleteLine=Are you sure you want to delete this line ? PDFStandardExpenseReports=Standard template to generate a PDF document for expense report ExpenseReportLine=Expense report line TF_OTHER=Other From 2aca50f7f850a2318174b2f6305575fa705df3c1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 6 Dec 2015 13:56:15 +0100 Subject: [PATCH 144/206] Removed useless string --- htdocs/langs/en_US/oauth.lang | 123 ---------------------------------- 1 file changed, 123 deletions(-) diff --git a/htdocs/langs/en_US/oauth.lang b/htdocs/langs/en_US/oauth.lang index b902ff27098..4cc08b058c6 100644 --- a/htdocs/langs/en_US/oauth.lang +++ b/htdocs/langs/en_US/oauth.lang @@ -9,129 +9,6 @@ RequestAccess=Click here to request/renew access and receive a new token to save DeleteAccess=Click here to delete token UseTheFollowingUrlAsRedirectURI=Use the following URL as the Redirect URI when creating your credential on your OAuth provider: ListOfSupportedOauthProviders=Enter here credential provided by your OAuth2 provider. Only supported OAuth2 providers are visible here. This setup may be used by other modules than need OAuth2 authentication. -OAUTH_AMAZON_NAME=Api Amazon -OAUTH_AMAZON_ID=Api Amazon Id -OAUTH_AMAZON_SECRET=Api Amazon Secret -OAUTH_BITBUCKET_NAME=Api Bitbucket -OAUTH_BITBUCKET_ID=Api Bitbucket Id -OAUTH_BITBUCKET_SECRET=Api Bitbucket Secret -OAUTH_BITLY_NAME=Api Bitly -OAUTH_BITLY_ID=Api Bitly Id -OAUTH_BITLY_SECRET=Api Bitly Secret -OAUTH_BITRIX24_NAME=Api Bitrix24 -OAUTH_BITRIX24_ID=Api Bitrix24 Id -OAUTH_BITRIX24_SECRET=Api Bitrix24 Secret -OAUTH_BOX_NAME=Api Box -OAUTH_BOX_ID=Api Box Id -OAUTH_BOX_SECRET=Api Box Secret -OAUTH_BUFFER_NAME=Api Buffer -OAUTH_BUFFER_ID=Api Buffer Id -OAUTH_BUFFER_SECRET=Api Buffer Secret -OAUTH_DAILYMOTION_NAME=Api Daylymotion -OAUTH_DAILYMOTION_ID=Api Daylymotion Id -OAUTH_DAILYMOTION_SECRET=Api Daylymotion Secret -OAUTH_DEVIANTART_NAME=Api DeviantArt -OAUTH_DEVIANTART_ID=Api DeviantArt Id -OAUTH_DEVIANTART_SECRET=Api DeviantArt Secret -OAUTH_DROPBOX_NAME=Api Dropbox -OAUTH_DROPBOX_ID=Api Dropbox Id -OAUTH_DROPBOX_SECRET=Api Dropbox Secret -OAUTH_ETSY_NAME=Api Etsy -OAUTH_ETSY_ID=Api Etsy Id -OAUTH_ETSY_SECRET=Api Etsy Secret -OAUTH_EVEONLINE_NAME=Api EveOnline -OAUTH_EVEONLINE_ID=Api EveOnline Id -OAUTH_EVEONLINE_SECRET=Api EveOnline Secret -OAUTH_FACEBOOK_NAME=Api Facebook -OAUTH_FACEBOOK_ID=Api Facebook Id -OAUTH_FACEBOOK_SECRET=Api Facebook Secret -OAUTH_FITBIT_NAME=Api FitBit -OAUTH_FITBIT_ID=Api FitBit Id -OAUTH_FITBIT_SECRET=Api FitBit Secret -OAUTH_FIVEHUNDREDPX_NAME=Api 500px -OAUTH_FIVEHUNDREDPX_ID=Api 500px Id -OAUTH_FIVEHUNDREDPX_SECRET=Api 500px Secret -OAUTH_FLICKR_NAME=Api Flickr -OAUTH_FLICKR_ID=Api Flickr Id -OAUTH_FLICKR_SECRET=Api Flickr Secret -OAUTH_FOURSQUARE_NAME=Api Foursquare -OAUTH_FOURSQUARE_ID=Api Foursquare Id -OAUTH_FOURSQUARE_SECRET=Api Foursquare Secret -OAUTH_GITHUB_NAME=Api Github -OAUTH_GITHUB_ID=Api Github Id -OAUTH_GITHUB_SECRET=Api Github Secret OAUTH_GOOGLE_NAME=Api Google OAUTH_GOOGLE_ID=Api Google Id OAUTH_GOOGLE_SECRET=Api Google Secret -OAUTH_HUBIC_NAME=Api Hubic -OAUTH_HUBIC_ID=Api Hubic Id -OAUTH_HUBIC_SECRET=Api Hubic Secret -OAUTH_INSTAGRAM_NAME=Api Instagram -OAUTH_INSTAGRAM_ID=Api Instagram Id -OAUTH_INSTAGRAM_SECRET=Api Instagram Secret -OAUTH_LINKEDIN_NAME=Api Linkedin -OAUTH_LINKEDIN_ID=Api Linkedin Id -OAUTH_LINKEDIN_SECRET=Api Linkedin Secret -OAUTH_MAILCHIMP_NAME=Api Mailchimp -OAUTH_MAILCHIMP_ID=Api Mailchimp Id -OAUTH_MAILCHIMP_SECRET=Api Mailchimp Secret -OAUTH_MICROSOFT_NAME=Api Microsoft -OAUTH_MICROSOFT_ID=Api Microsoft Id -OAUTH_MICROSOFT_SECRET=Api Microsoft Secret -OAUTH_NEST_NAME=Api Nest -OAUTH_NEST_ID=Api Nest Id -OAUTH_NEST_SECRET=Api Nest Secret -OAUTH_NETATMO_NAME=Api Netatmo -OAUTH_NETATMO_ID=Api Netatmo Id -OAUTH_NETATMO_SECRET=Api Netatmo Secret -OAUTH_PARROTFLOWERPOWER_NAME=Api Parrot Flower Power -OAUTH_PARROTFLOWERPOWER_ID=Api Parrot Flower Power Id -OAUTH_PARROTFLOWERPOWER_SECRET=Api Parrot Flower Power Secret -OAUTH_PAYPAL_NAME=Api Paypal -OAUTH_PAYPAL_ID=Api Paypal Id -OAUTH_PAYPAL_SECRET=Api Paypal Secret -OAUTH_POCKET_NAME=Api Pocket -OAUTH_POCKET_ID=Api Pocket Id -OAUTH_POCKET_SECRET=Api Pocket Secret -OAUTH_QUICKBOOKS_NAME=Api Quickbooks -OAUTH_QUICKBOOKS_ID=Api Quickbooks Id -OAUTH_QUICKBOOKS_SECRET=Api Quickbooks Secret -OAUTH_REDDIT_NAME=Api Reddit -OAUTH_REDDIT_ID=Api Reddit Id -OAUTH_REDDIT_SECRET=Api Reddit Secret -OAUTH_REDMINE_NAME=Api Redmine -OAUTH_REDMINE_ID=Api Redmine Id -OAUTH_REDMINE_SECRET=Api Redmine Secret -OAUTH_RUNKEEPER_NAME=Api Runkeeper -OAUTH_RUNKEEPER_ID=Api Runkeeper Id -OAUTH_RUNKEEPER_SECRET=Api Runkeeper Secret -OAUTH_SCOOPIT_NAME=Api Scoopit -OAUTH_SCOOPIT_ID=Api Scoopit Id -OAUTH_SCOOPIT_SECRET=Api Scoopit Secret -OAUTH_SOUNDCLOUD_NAME=Api Soundcloud -OAUTH_SOUNDCLOUD_ID=Api Soundcloud Id -OAUTH_SOUNDCLOUD_SECRET=Api Soundcloud Secret -OAUTH_SPOTIFY_NAME=Api Spotify -OAUTH_SPOTIFY_ID=Api Spotify id -OAUTH_SPOTIFY_SECRET=Api Spotify Secret -OAUTH_STRAVA_NAME=Api Strava -OAUTH_STRAVA_ID=Api Strava Id -OAUTH_STRAVA_SECRET=Api Strava Secret -OAUTH_TUMBLR_NAME=Api Tumblr -OAUTH_TUMBLR_ID=Api Tumblr Id -OAUTH_TUMBLR_SECRET=Api Tumblr Secret -OAUTH_TWITTER_NAME=Api Twitter -OAUTH_TWITTER_ID=Api Twitter Id -OAUTH_TWITTER_SECRET=Api Twitter Secret -OAUTH_USTREAM_NAME=Api Ustream -OAUTH_USTREAM_ID=Api Ustream Id -OAUTH_USTREAM_SECRET=Api Ustream Secret -OAUTH_VIMEO_NAME=Api Vimeo -OAUTH_VIMEO_ID=Api Vimeo Id -OAUTH_VIMEO_SECRET=Api Vimeo Secret -OAUTH_YAHOO_NAME=Api Yahoo -OAUTH_YAHOO_ID=Api Yahoo Id -OAUTH_YAHOO_SECRET=Api Yahoo Secret -OAUTH_YAMMER_NAME=Api Yammer -OAUTH_YAMMER_ID=Api Yammer Id -OAUTH_YAMMER_SECRET=Api Yammer Secret From 3df097f4bf969a611e466a7dd9972658c38f0e8d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 6 Dec 2015 14:06:37 +0100 Subject: [PATCH 145/206] Update doc --- build/makepack-howto.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/makepack-howto.txt b/build/makepack-howto.txt index 2bf516dfe88..b4a13badbf4 100644 --- a/build/makepack-howto.txt +++ b/build/makepack-howto.txt @@ -9,7 +9,7 @@ beta version of Dolibarr, step by step. - Check all files are commited. - Update version/info in ChangeLog. -To generate a changelog of a major new version x.y.0, you can do "cd ~/git/dolibarr_x.y; git log `git rev-list --boundary x.y..origin/develop | grep ^- | cut -c2- | head -n`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa" +To generate a changelog of a major new version x.y.0, you can do "cd ~/git/dolibarr_x.y; git log `git rev-list --boundary x.y..origin/develop | grep ^- | cut -c2- | head -n 1`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa" To generate a changelog of a maintenance version x.y.z, you can do "cd ~/git/dolibarr_x.y; git log x.y.z-1.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa" - Update version number with x.y.z-w in htdocs/filefunc.inc.php - Commit all changes. @@ -31,7 +31,7 @@ complete release of Dolibarr, step by step. - Check all files are commited. - Update version/info in ChangeLog. -To generate a changelog of a major new version x.y.0, you can do "cd ~/git/dolibarr_x.y; git log `git rev-list --boundary x.y..origin/develop | grep ^- | cut -c2- | head -n`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa" +To generate a changelog of a major new version x.y.0, you can do "cd ~/git/dolibarr_x.y; git log `git rev-list --boundary x.y..origin/develop | grep ^- | cut -c2- | head -n 1`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa" To generate a changelog of a maintenance version x.y.z, you can do "cd ~/git/dolibarr_x.y; git log x.y.z-1.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa" - Update version number with x.y.z in htdocs/filefunc.inc.php - Commit all changes. From d9533e90011da0f38050b18f15f65cf67b006b78 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 6 Dec 2015 14:27:52 +0100 Subject: [PATCH 146/206] Prepare 3.9 --- ChangeLog | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) diff --git a/ChangeLog b/ChangeLog index 09e216e93fc..e24ed014b2b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -13,11 +13,147 @@ make a Dolibarr upgrade. ***** ChangeLog for 3.9 compared to 3.8.* ***** +For users: +NEW: #3767 Allow changing multiple prices of a product at once +NEW: Add a button to purge criteria in user list +NEW: Add a filter field to restrict list of member when doing a LDAP list request. Use also this filter into ldap command line script making sync from ldap to dolibarr. +NEW: Add all assigned users and all extrafields data in new event when we createFromClone +NEW: Add hidden option to use standard position address in crabe model For electronic sending solutions +NEW: Add a refresh button on page list of direct print jobs. +NEW: Add a tab document in donation card +NEW: Add cancel button on thirdparty create page +NEW: Add chart of product statistics +NEW: Add color on categories +NEW: Add css on column of detail lines to allow module to easily manipulate fields. +NEW: Add date value filter on account records list +NEW: Added __PROJECT_NAME__ tag for customer invoice emails +NEW: Add exemple of setup for multitail to render dolibarr log files +NEW: Add experimental option PDF_ALLOW_HTML_FOR_FREE_TEXT to be able to enter pdf footer text with wysiwyg editor. +NEW: Add fields into llx_cronjobs to be able to use job table to queue one shot jobs. +NEW: Add filter on status on invoice list +NEW: Add filter on status on shipments +NEW: Add gender property managed on user card FIX: Better error messages when uploading photo of user when permission to write are not granted +NEW: Add help tooltips on fields of dictionary edit pages. Fix: visible list of tasks are for opened project only. +NEW: Add hidden option MAIN_MAILFORM_DISABLE_ENTERKEY to disable the key enter into the form to send email. +NEW: add hook in send mail +NEW: Add hooks on list of members to allow an external module to add more fields into list view. +NEW: Add hooks to allow an external module to complete list of events into calendar views. +NEW: add $ID$ into extrafields management to allow use current object id on filter for select list from table and checkbox list from table +NEW: add info page on product card +NEW: Add into about page, a sample text to use to promote new version release (visible only if version is last stable) +NEW: Add none/all selection into list of files for FTP browser module +NEW: Add opportunity amount on project card. +NEW: Add option THEME_ELDY_DISABLE_IMAGE to disable images into menu eldy. +NEW: Add parameter to add a link to use "date of invoice" in one click when fille a payment card. +NEW: Add planned workload and declared progress on project summary list on project home page (data aggregated from tasks of project) +NEW: add "productpricecard" hook and uniformize code +NEW: Add ref and label of project into export +NEW: add restler framework First step to build REST API into Dolibarr +NEW: Add status into filters of graph +NEW: Add tab document on salaries payment +NEW: Add thumb of users into thumbs stats on home page +NEW: A link to the bugtracker can be enabled in the GUI +NEW: Better look for POS. More responsive design. +NEW: Can add project search on left menu search area +NEW: Can assign a task to yourself to have it appear on timesheet +NEW: Can choose fields to show on project list +NEW: Can close a project that has draft status with no need to switch it to validate status before. +NEW: Can edit Background color for Top menu and Background color for table title line. +NEW: Can edit email template using WYSIWYG editor +NEW: Can edit list of prospect status for customers/prospects. Add a new entry into dictionary table to manage list fo status. Removed deprecated files. +NEW: Can filter on contact status in prospect list. Removed deprecated menu entry. +NEW: Can filter proposal on a tag of a product Enhance also the prototype test_arrays to include select form before table. +NEW: Can filter proposal, orders or invoices with criteria "contain at least one product with following tag" +NEW: Can select fields to show in product list. Extrafields are also supported. +NEW: Can select fields to show into the contact list. Extrafields are also supported. +NEW: Can select which field to show into list of users. Extrafields are also supported. +NEW: Can set default value of event type when creating an event (if type of event option is used). +NEW: Can upload files on leave requests. Use more standard permissions. +NEW: Can use a "|" to make a OR search on several different criterias into text filters of tables. +NEW: Can use the * as a joker characters into search boxes of lists +NEW: Clean code into salary module, debug and add indexes NEW: Can filter on user list and salary payments on user with naural search. +NEW: clone action on agenda events +NEW: Color category is visible onto the thumb of tags on thirdparty, or products cards. +NEW: conf to use next product/service ref when we clone a product/service +NEW: Contract module can be used to follow both sold and bought contracts/recurring subscriptions. +NEW: Enhance prototype, project list and proposal list with new hooks to have an external module able to add more fields. +NEW: Enhance style engine. Add option to set color of links. +NEW: Enter amount for withdraws requests +NEW: FEATURE PROPOSAL: on proposal, order or invoice creation from scratch, reload page after customer selection so its informations can be loaded +NEW: Filter "active" by default on user list. Fix label of permission of project module. +NEW: Forms are using the tab look, even in creation mode. +NEW: Free text for cheque deposit receipt can be HTML content. +NEW: Hidden option THEME_ELDY_USE_HOVER is stable enough to become officialy visible into setup. +NEW: If module salaries is on, you can set a hourly value for time consumed by users. Each time a user enter its time consumed on a project, a calculation is done to provide the cost for human services. This value appears into the "Transversal view" of project. +NEW: Import Sales representatives of third parties +NEW: Increase length of bank code to 128 char #3704 +NEW: info function for product card +NEW: Into the overview of projects, the name of thirdparty appears into combo lists of elements to link to project. +NEW: Introduce a "code" into fiels to describe vat. This will allow to suggest different vat lines with same value with ability to differentiate them. +NEW: Introduce cost price on product. +NEW: Introduce hidden option MAIN_LANDING_PAGE to decide the home page visible just after login. +NEW: Introduce hidden option MAIN_REPLACE_TRANS_xx_XX to allow simple replacement of translated string on the fly. +NEW: Introduce table llx_overwrite_trans to be able to overwrite translations by simple database edition. +NEW: Introduce use of cache for thumbs images of users +NEW: Experimental level multiprice generator based on per cent variations over base price +NEW: List of projects of a thirdparty are visible on a project tab +NEW: Merge all left menu search boxes into one. +NEW: Merge all search fields of an area page into one search box +NEW: next ref on clone doesn't need conf, it's used if mask exists +NEW: ODT generators can set meta properties of ODT file +NEW: On list of thirdparties, user can select fields to show. Make phpunit test working again localy. Add missing columns into llx_expedition. +NEW: Only arrow of current sorted field is visible into table views. This save a lot of spaces. You can click on the column title to sort. This make clickable area larger and click to sort is easier. +NEW: On page to see/edit contact of an ojbect, the status of contact is visible (for both external and internal users). +NEW: Option encrypt password into databae is set to on by default on first install. +NEW: print event type on third party card tab agenda list (only if AGENDA_USE_EVENT_TYPE = 1) +NEW: Provide an easier way to understand if an order can be shipped. +NEW: Quick searh filter works on invoice, proposal, order, intervention, contract +NEW: Rename install "etape" into english "step" +NEW: Replace category edition page on members with new select2 component. +NEW: Show photo of logged user into login top right block. NEW: If no photo is available for user, we show a generic photo depending on gender +NEW: Show photo of user into user list. A new function getImageFileNameForSize was also introduced to choose image best size according to usage to save bandwith. +NEW: Show which fields are used for search when doing a generic search from the quick search form. +NEW: Statistic graphs on products offer a filter on product type (product / service or both) +NEW: Support logging to a Sentry server +NEW: Syslog displays configuration errors +NEW: [ task 1191 ] AJAX selector for projects +NEW: [ task #3768 ] Improve product multiprices view +NEW: [ task #851 ] Add a new field: Commercial name +NEW: The clicktodial module is now able to provide link "tel:" on phone numbers. So it is also possible to use clicktodial with a client solution like the "xivo" local client. +NEW: The conditional IF into ODT templates works also on not defined var so we can show data only if defined. Close #3819 +NEW: The free text in PDF footer can now be a HTML content. So the WYSIWYG editor is on by default to edit it into module setup. +NEW: The line where mouse is over can be highlight with option THEME_ELDY_USE_HOVER (on by default) +NEW: The quick search box on left menu can also search into expense reports. +NEW: The search box and the bookmarks are now rendered by the menu manager. +NEW: The thirdparties tabs, the contacts tabs and the members tabs are now presented using a new top banner, saving space and using a same way to show address, status and navigation arrows. +NEW: Thumbs for statistics on main page are fully clicable (not only link inside the thumb) +NEW: Translate extrafield's labels +NEW: Uniformize way of working for search filters. One filter per object. +NEW: Used matching icons for Material Design theme +NEW: Use new select2 component for juridical status, country and state selection. +NEW: When creating order, proposal or invoice from thirdparty card, the project is asked during creation. A link to create project if it does not exists is also available. NEW: Uniformize form creation of proposal to add public and private notes during creation like done for order and invoice. + +For developers: +NEW: Add a new widget $form->selectArrayAjax() to use combo list with content coming from an Ajax URL. +NEW: Add doActions hook method call in contract card +NEW: Added doActions hooks to user cards +NEW: Add a new component to select categories/tags from the main edit page of product. The dedicated tab is also removed. +NEW: upgrade jQuery Component Datable (and extras) to 1.10.7 +NEW: script to build API class from existing class +NEW: Prepare database to store information per files (for example to define if an image can be used as a cover or not) +NEW: log hooks loading +NEW: Introduce property module_position so a module can decide where it appears into list of modules. +NEW: Introduce function dolGetFirstLineOfText +NEW: Introduce a method getDefaultCreateValueForField for developers to get a default value to use for a form in create mode. Implement it for public and private notes. +NEW: A module can add its entries into cron module. +NEW: Framework feature. To have a page being loaded at same scrollbar level after a click on a href link, just add the class "reposition" on this link. + WARNING: Following changes may create regression for some external modules, but were necessary to make Dolibarr better: +- Deprecated Product::setPriceExpression. Use Product::update instead - Deprecated hidden option MAIN_USE_CUSTOM_TRANSLATION has been removed. Use table llx_overwrite_trans instead. - Trigger LINECONTRACT_INSERT has been renamed into LINECONTRACT_CREATE to match common denomination. - A lot hooks used into PDF generation were not correctly implemented. We had to fix this. The result si that @@ -27,6 +163,8 @@ This is list of hooks modified: 'pdf_getlinenum', 'pdf_getlineref', 'pdf_getlineref_supplier', 'pdf_getlinevatrate', 'pdf_getlineupexcltax', 'pdf_getlineupwithtax', 'pdf_getlineqty', 'pdf_getlineqty_asked', 'pdf_getlineqty_shipped', 'pdf_getlineqty_keeptoship', 'pdf_getlineunit', 'pdf_getlineremisepercent', 'pdf_getlineprogress', 'pdf_getlinetotalexcltax', 'pdf_getlinetotalwithtax' +- Renamed Product::isservice and Product::isproduct to match PSR-2 +- Remove deprecated Product::hidden property From e470869afe4502abf69fa7f39c6e7979154e9649 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 6 Dec 2015 14:35:36 +0100 Subject: [PATCH 147/206] Prepare 3.9 --- ChangeLog | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index e24ed014b2b..d2b0d63216a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,41 +14,40 @@ make a Dolibarr upgrade. ***** ChangeLog for 3.9 compared to 3.8.* ***** For users: +NEW: A new and more modern look for "eldy" theme. +NEW: Introduce a new theme called "Material Design". NEW: #3767 Allow changing multiple prices of a product at once NEW: Add a button to purge criteria in user list NEW: Add a filter field to restrict list of member when doing a LDAP list request. Use also this filter into ldap command line script making sync from ldap to dolibarr. NEW: Add all assigned users and all extrafields data in new event when we createFromClone NEW: Add hidden option to use standard position address in crabe model For electronic sending solutions NEW: Add a refresh button on page list of direct print jobs. -NEW: Add a tab document in donation card +NEW: Add a tab "document" in donation card NEW: Add cancel button on thirdparty create page NEW: Add chart of product statistics NEW: Add color on categories -NEW: Add css on column of detail lines to allow module to easily manipulate fields. +NEW: Add css class and ids on column of detail lines to allow module to easily manipulate fields. NEW: Add date value filter on account records list -NEW: Added __PROJECT_NAME__ tag for customer invoice emails -NEW: Add exemple of setup for multitail to render dolibarr log files -NEW: Add experimental option PDF_ALLOW_HTML_FOR_FREE_TEXT to be able to enter pdf footer text with wysiwyg editor. +NEW: Add __PROJECT_NAME__ tag for customer invoice emails +NEW: Add option PDF_ALLOW_HTML_FOR_FREE_TEXT to be able to enter pdf footer text with wysiwyg editor. NEW: Add fields into llx_cronjobs to be able to use job table to queue one shot jobs. NEW: Add filter on status on invoice list NEW: Add filter on status on shipments NEW: Add gender property managed on user card FIX: Better error messages when uploading photo of user when permission to write are not granted -NEW: Add help tooltips on fields of dictionary edit pages. Fix: visible list of tasks are for opened project only. +NEW: Add help tooltips on fields of dictionary edit pages. NEW: Add hidden option MAIN_MAILFORM_DISABLE_ENTERKEY to disable the key enter into the form to send email. -NEW: add hook in send mail +NEW: Add hook in send mail NEW: Add hooks on list of members to allow an external module to add more fields into list view. NEW: Add hooks to allow an external module to complete list of events into calendar views. -NEW: add $ID$ into extrafields management to allow use current object id on filter for select list from table and checkbox list from table -NEW: add info page on product card +NEW: Add $ID$ into extrafields management to allow use of current object id on filter for select list from table and checkbox list from table +NEW: Add info page on product card NEW: Add into about page, a sample text to use to promote new version release (visible only if version is last stable) NEW: Add none/all selection into list of files for FTP browser module NEW: Add opportunity amount on project card. -NEW: Add option THEME_ELDY_DISABLE_IMAGE to disable images into menu eldy. NEW: Add parameter to add a link to use "date of invoice" in one click when fille a payment card. NEW: Add planned workload and declared progress on project summary list on project home page (data aggregated from tasks of project) -NEW: add "productpricecard" hook and uniformize code +NEW: Add "productpricecard" hook and uniformize code NEW: Add ref and label of project into export -NEW: add restler framework First step to build REST API into Dolibarr NEW: Add status into filters of graph NEW: Add tab document on salaries payment NEW: Add thumb of users into thumbs stats on home page @@ -116,13 +115,9 @@ NEW: Show which fields are used for search when doing a generic search from the NEW: Statistic graphs on products offer a filter on product type (product / service or both) NEW: Support logging to a Sentry server NEW: Syslog displays configuration errors -NEW: [ task 1191 ] AJAX selector for projects -NEW: [ task #3768 ] Improve product multiprices view -NEW: [ task #851 ] Add a new field: Commercial name NEW: The clicktodial module is now able to provide link "tel:" on phone numbers. So it is also possible to use clicktodial with a client solution like the "xivo" local client. NEW: The conditional IF into ODT templates works also on not defined var so we can show data only if defined. Close #3819 NEW: The free text in PDF footer can now be a HTML content. So the WYSIWYG editor is on by default to edit it into module setup. -NEW: The line where mouse is over can be highlight with option THEME_ELDY_USE_HOVER (on by default) NEW: The quick search box on left menu can also search into expense reports. NEW: The search box and the bookmarks are now rendered by the menu manager. NEW: The thirdparties tabs, the contacts tabs and the members tabs are now presented using a new top banner, saving space and using a same way to show address, status and navigation arrows. @@ -147,6 +142,8 @@ NEW: Introduce function dolGetFirstLineOfText NEW: Introduce a method getDefaultCreateValueForField for developers to get a default value to use for a form in create mode. Implement it for public and private notes. NEW: A module can add its entries into cron module. NEW: Framework feature. To have a page being loaded at same scrollbar level after a click on a href link, just add the class "reposition" on this link. +NEW: Add exemple of setup for multitail to render dolibarr log files +NEW: Add restler framework. First step to build REST API into Dolibarr. WARNING: From 984068c136addf80da93678f1b8568413290ba4b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 6 Dec 2015 19:17:39 +0100 Subject: [PATCH 148/206] Fix length of password too low (password was truncated making them inoperent) --- htdocs/install/mysql/migration/3.8.0-3.9.0.sql | 2 ++ htdocs/install/mysql/tables/llx_user.sql | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/install/mysql/migration/3.8.0-3.9.0.sql b/htdocs/install/mysql/migration/3.8.0-3.9.0.sql index 767a7dd0e7a..d29b87ddf61 100755 --- a/htdocs/install/mysql/migration/3.8.0-3.9.0.sql +++ b/htdocs/install/mysql/migration/3.8.0-3.9.0.sql @@ -29,6 +29,8 @@ ALTER TABLE llx_don ADD COLUMN fk_country integer NOT NULL DEFAULT 0 after count UPDATE llx_commande_fourn set billed=1 where statut = 8; UPDATE llx_commande_fourn set statut=5 where statut = 8 and billed=1; +ALTER TABLE llx_user MODIFY COLUMN pass varchar(128); +ALTER TABLE llx_user MODIFY COLUMN pass_temp varchar(128); ALTER TABLE llx_askpricesupplier RENAME TO llx_supplier_proposal; ALTER TABLE llx_askpricesupplierdet RENAME TO llx_supplier_proposaldet; diff --git a/htdocs/install/mysql/tables/llx_user.sql b/htdocs/install/mysql/tables/llx_user.sql index 7263803feb6..e334ae1f802 100644 --- a/htdocs/install/mysql/tables/llx_user.sql +++ b/htdocs/install/mysql/tables/llx_user.sql @@ -34,9 +34,9 @@ create table llx_user fk_user_creat integer, fk_user_modif integer, login varchar(24) NOT NULL, - pass varchar(32), + pass varchar(128), pass_crypted varchar(128), - pass_temp varchar(32), -- temporary password when asked for forget password + pass_temp varchar(128), -- temporary password when asked for forget password api_key varchar(128), -- key to use REST API by this user gender varchar(10), civility varchar(6), From a209d1864984e26b39cbfd13f2634d513ef466ec Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 6 Dec 2015 19:51:28 +0100 Subject: [PATCH 149/206] FIX Can use formated float number on old expense report module. --- htdocs/compta/deplacement/card.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/deplacement/card.php b/htdocs/compta/deplacement/card.php index 3676a87567d..939c50e68d9 100644 --- a/htdocs/compta/deplacement/card.php +++ b/htdocs/compta/deplacement/card.php @@ -115,7 +115,7 @@ else if ($action == 'add' && $user->rights->deplacement->creer) $error=0; $object->date = dol_mktime(12, 0, 0, GETPOST('remonth','int'), GETPOST('reday','int'), GETPOST('reyear','int')); - $object->km = GETPOST('km','int'); + $object->km = price2num(GETPOST('km','alpha'), 'MU'); // Not 'int', it may be a formated amount $object->type = GETPOST('type','alpha'); $object->socid = GETPOST('socid','int'); $object->fk_user = GETPOST('fk_user','int'); @@ -174,7 +174,7 @@ else if ($action == 'update' && $user->rights->deplacement->creer) $result = $object->fetch($id); $object->date = dol_mktime(12, 0, 0, GETPOST('remonth','int'), GETPOST('reday','int'), GETPOST('reyear','int')); - $object->km = GETPOST('km','int'); + $object->km = price2num(GETPOST('km','alpha'), 'MU'); // Not 'int', it may be a formated amount $object->type = GETPOST('type','alpha'); $object->socid = GETPOST('socid','int'); $object->fk_user = GETPOST('fk_user','int'); From 7e31c8f38f221b3a8bb78b319467f0cd5adae57b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20L=C3=A9onard?= Date: Mon, 7 Dec 2015 01:27:08 +0100 Subject: [PATCH 150/206] Fix decimals in payments of supplier invoices --- htdocs/fourn/class/paiementfourn.class.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/htdocs/fourn/class/paiementfourn.class.php b/htdocs/fourn/class/paiementfourn.class.php index 98876ab2519..5326bbde85e 100644 --- a/htdocs/fourn/class/paiementfourn.class.php +++ b/htdocs/fourn/class/paiementfourn.class.php @@ -128,10 +128,9 @@ class PaiementFourn extends Paiement $this->total = 0; foreach ($this->amounts as $key => $value) { - $value = price2num($value); - $val = round($value, 2); - $this->amounts[$key] = $val; - $this->total += $val; + $newvalue = price2num($value, 'MT'); + $this->amounts[$key] = $newvalue; + $this->total += $newvalue; } $this->total = price2num($this->total); From 05234390f287b484f366b12edfbcfe99ccdd60e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20L=C3=A9onard?= Date: Mon, 7 Dec 2015 02:02:03 +0100 Subject: [PATCH 151/206] Fix uniqueness of objects reference --- htdocs/core/class/commonobject.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index bba17f50d11..659ff4d3c5a 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -364,6 +364,7 @@ abstract class CommonObject dol_print_error(get_class()."::isExistingObject ".$error, LOG_ERR); return -1; } + if ($ref || $ref_ext) $sql.= " AND entity = ".$conf->entity; dol_syslog(get_class()."::isExistingObject", LOG_DEBUG); $resql = $db->query($sql); From 1dc58545351476d5587024f97887135c1a462562 Mon Sep 17 00:00:00 2001 From: Ion Agorria Date: Mon, 7 Dec 2015 03:59:03 +0100 Subject: [PATCH 152/206] Fix date handling for hours/mins in some pages --- htdocs/comm/propal.php | 8 ++++---- htdocs/commande/card.php | 8 ++++---- htdocs/fourn/commande/card.php | 11 ++++------- htdocs/fourn/facture/card.php | 11 +++++++---- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 9ab3a1967f1..e039342dd38 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -862,8 +862,8 @@ if (empty($reshook)) $fournprice = price2num(GETPOST('fournprice' . $predef) ? GETPOST('fournprice' . $predef) : ''); $buyingprice = price2num(GETPOST('buying_price' . $predef) != '' ? GETPOST('buying_price' . $predef) : ''); // If buying_price is '0', we muste keep this value - $date_start = dol_mktime(0, 0, 0, GETPOST('date_start' . $predef . 'month'), GETPOST('date_start' . $predef . 'day'), GETPOST('date_start' . $predef . 'year')); - $date_end = dol_mktime(0, 0, 0, GETPOST('date_end' . $predef . 'month'), GETPOST('date_end' . $predef . 'day'), GETPOST('date_end' . $predef . 'year')); + $date_start = dol_mktime(GETPOST('date_start' . $predef . 'hour'), GETPOST('date_start' . $predef . 'min'), GETPOST('date_start' . $predef . 'sec'), GETPOST('date_start' . $predef . 'month'), GETPOST('date_start' . $predef . 'day'), GETPOST('date_start' . $predef . 'year')); + $date_end = dol_mktime(GETPOST('date_end' . $predef . 'hour'), GETPOST('date_end' . $predef . 'min'), GETPOST('date_end' . $predef . 'sec'), GETPOST('date_end' . $predef . 'month'), GETPOST('date_end' . $predef . 'day'), GETPOST('date_end' . $predef . 'year')); // Local Taxes $localtax1_tx = get_localtax($tva_tx, 1, $object->thirdparty); @@ -957,8 +957,8 @@ if (empty($reshook)) $fournprice = price2num(GETPOST('fournprice') ? GETPOST('fournprice') : ''); $buyingprice = price2num(GETPOST('buying_price') != '' ? GETPOST('buying_price') : ''); // If buying_price is '0', we muste keep this value - $date_start = dol_mktime(0, 0, 0, GETPOST('date_startmonth'), GETPOST('date_startday'), GETPOST('date_startyear')); - $date_end = dol_mktime(0, 0, 0, GETPOST('date_endmonth'), GETPOST('date_endday'), GETPOST('date_endyear')); + $date_start = dol_mktime(GETPOST('date_starthour'), GETPOST('date_startmin'), GETPOST('date_startsec'), GETPOST('date_startmonth'), GETPOST('date_startday'), GETPOST('date_startyear')); + $date_end = dol_mktime(GETPOST('date_endhour'), GETPOST('date_endmin'), GETPOST('date_endsec'), GETPOST('date_endmonth'), GETPOST('date_endday'), GETPOST('date_endyear')); // Extrafields $extrafieldsline = new ExtraFields($db); diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 7da702dea23..8352a20797c 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -626,8 +626,8 @@ if (empty($reshook)) if (! $error && ($qty >= 0) && (! empty($product_desc) || ! empty($idprod))) { // Clean parameters - $date_start=dol_mktime(GETPOST('date_start'.$predef.'hour'), GETPOST('date_start'.$predef.'min'), 0, GETPOST('date_start'.$predef.'month'), GETPOST('date_start'.$predef.'day'), GETPOST('date_start'.$predef.'year')); - $date_end=dol_mktime(GETPOST('date_start'.$predef.'hour'), GETPOST('date_start'.$predef.'min'), 0, GETPOST('date_end'.$predef.'month'), GETPOST('date_end'.$predef.'day'), GETPOST('date_end'.$predef.'year')); + $date_start=dol_mktime(GETPOST('date_start'.$predef.'hour'), GETPOST('date_start'.$predef.'min'), GETPOST('date_start'.$predef.'sec'), GETPOST('date_start'.$predef.'month'), GETPOST('date_start'.$predef.'day'), GETPOST('date_start'.$predef.'year')); + $date_end=dol_mktime(GETPOST('date_end'.$predef.'hour'), GETPOST('date_end'.$predef.'min'), GETPOST('date_end'.$predef.'sec'), GETPOST('date_end'.$predef.'month'), GETPOST('date_end'.$predef.'day'), GETPOST('date_end'.$predef.'year')); $price_base_type = (GETPOST('price_base_type', 'alpha')?GETPOST('price_base_type', 'alpha'):'HT'); // Ecrase $pu par celui du produit @@ -833,8 +833,8 @@ if (empty($reshook)) // Clean parameters $date_start=''; $date_end=''; - $date_start=dol_mktime(GETPOST('date_starthour'), GETPOST('date_startmin'), 0, GETPOST('date_startmonth'), GETPOST('date_startday'), GETPOST('date_startyear')); - $date_end=dol_mktime(GETPOST('date_starthour'), GETPOST('date_startmin'), 0, GETPOST('date_endmonth'), GETPOST('date_endday'), GETPOST('date_endyear')); + $date_start=dol_mktime(GETPOST('date_starthour'), GETPOST('date_startmin'), GETPOST('date_startsec'), GETPOST('date_startmonth'), GETPOST('date_startday'), GETPOST('date_startyear')); + $date_end=dol_mktime(GETPOST('date_endhour'), GETPOST('date_endmin'), GETPOST('date_endsec'), GETPOST('date_endmonth'), GETPOST('date_endday'), GETPOST('date_endyear')); $description=dol_htmlcleanlastbr(GETPOST('product_desc')); $pu_ht=GETPOST('price_ht'); $vat_rate=(GETPOST('tva_tx')?GETPOST('tva_tx'):0); diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index baa11ed9c07..7f8aca2fa55 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -95,9 +95,6 @@ $extrafields = new ExtraFields($db); // fetch optionals attributes and labels $extralabels=$extrafields->fetch_name_optionals_label($object->table_element); -//Date prefix -$date_pf = ''; - // Load object if ($id > 0 || ! empty($ref)) { @@ -263,8 +260,8 @@ if (empty($reshook)) // Set if we used free entry or predefined product $predef=''; $product_desc=(GETPOST('dp_desc')?GETPOST('dp_desc'):''); - $date_start=dol_mktime(GETPOST('date_start'.$date_pf.'hour'), GETPOST('date_start'.$date_pf.'min'), 0, GETPOST('date_start'.$date_pf.'month'), GETPOST('date_start'.$date_pf.'day'), GETPOST('date_start'.$date_pf.'year')); - $date_end=dol_mktime(GETPOST('date_end'.$date_pf.'hour'), GETPOST('date_end'.$date_pf.'min'), 0, GETPOST('date_end'.$date_pf.'month'), GETPOST('date_end'.$date_pf.'day'), GETPOST('date_end'.$date_pf.'year')); + $date_start=dol_mktime(GETPOST('date_start'.$predef.'hour'), GETPOST('date_start'.$predef.'min'), GETPOST('date_start' . $predef . 'sec'), GETPOST('date_start'.$predef.'month'), GETPOST('date_start'.$predef.'day'), GETPOST('date_start'.$predef.'year')); + $date_end=dol_mktime(GETPOST('date_end'.$predef.'hour'), GETPOST('date_end'.$predef.'min'), GETPOST('date_end' . $predef . 'sec'), GETPOST('date_end'.$predef.'month'), GETPOST('date_end'.$predef.'day'), GETPOST('date_end'.$predef.'year')); if (GETPOST('prod_entry_mode') == 'free') { $idprod=0; @@ -506,8 +503,8 @@ if (empty($reshook)) if (!$res) dol_print_error($db); } - $date_start=dol_mktime(GETPOST('date_start'.$date_pf.'hour'), GETPOST('date_start'.$date_pf.'min'), 0, GETPOST('date_start'.$date_pf.'month'), GETPOST('date_start'.$date_pf.'day'), GETPOST('date_start'.$date_pf.'year')); - $date_end=dol_mktime(GETPOST('date_end'.$date_pf.'hour'), GETPOST('date_end'.$date_pf.'min'), 0, GETPOST('date_end'.$date_pf.'month'), GETPOST('date_end'.$date_pf.'day'), GETPOST('date_end'.$date_pf.'year')); + $date_start=dol_mktime(GETPOST('date_starthour'), GETPOST('date_startmin'), GETPOST('date_startsec'), GETPOST('date_startmonth'), GETPOST('date_startday'), GETPOST('date_startyear')); + $date_end=dol_mktime(GETPOST('date_endhour'), GETPOST('date_endmin'), GETPOST('date_endsec'), GETPOST('date_endmonth'), GETPOST('date_endday'), GETPOST('date_endyear')); $localtax1_tx=get_localtax($tva_tx,1,$mysoc,$object->thirdparty); $localtax2_tx=get_localtax($tva_tx,2,$mysoc,$object->thirdparty); diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 82cdbe03b64..1c25e863683 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -575,8 +575,8 @@ if (empty($reshook)) $type = $_POST["type"]?$_POST["type"]:0; } - $date_start=dol_mktime(GETPOST('date_start'.$date_pf.'hour'), GETPOST('date_start'.$date_pf.'min'), 0, GETPOST('date_start'.$date_pf.'month'), GETPOST('date_start'.$date_pf.'day'), GETPOST('date_start'.$date_pf.'year')); - $date_end=dol_mktime(GETPOST('date_end'.$date_pf.'hour'), GETPOST('date_end'.$date_pf.'min'), 0, GETPOST('date_end'.$date_pf.'month'), GETPOST('date_end'.$date_pf.'day'), GETPOST('date_end'.$date_pf.'year')); + $date_start=dol_mktime(GETPOST('date_starthour'), GETPOST('date_startmin'), GETPOST('date_startsec'), GETPOST('date_startmonth'), GETPOST('date_startday'), GETPOST('date_startyear')); + $date_end=dol_mktime(GETPOST('date_endhour'), GETPOST('date_endmin'), GETPOST('date_endsec'), GETPOST('date_endmonth'), GETPOST('date_endday'), GETPOST('date_endyear')); $localtax1_tx= get_localtax($_POST['tauxtva'], 1, $mysoc,$object->thirdparty); $localtax2_tx= get_localtax($_POST['tauxtva'], 2, $mysoc,$object->thirdparty); @@ -640,6 +640,9 @@ if (empty($reshook)) $qty = GETPOST('qty'.$predef); $remise_percent=GETPOST('remise_percent'.$predef); + $date_start=dol_mktime(GETPOST('date_start'.$predef.'hour'), GETPOST('date_start'.$predef.'min'), GETPOST('date_start' . $predef . 'sec'), GETPOST('date_start'.$predef.'month'), GETPOST('date_start'.$predef.'day'), GETPOST('date_start'.$predef.'year')); + $date_end=dol_mktime(GETPOST('date_end'.$predef.'hour'), GETPOST('date_end'.$predef.'min'), GETPOST('date_end' . $predef . 'sec'), GETPOST('date_end'.$predef.'month'), GETPOST('date_end'.$predef.'day'), GETPOST('date_end'.$predef.'year')); + // Extrafields $extrafieldsline = new ExtraFields($db); $extralabelsline = $extrafieldsline->fetch_name_optionals_label($object->table_element_line); @@ -710,7 +713,7 @@ if (empty($reshook)) $price_base_type = 'HT'; // TODO Save the product supplier ref into database into field ref_supplier (must rename field ref into ref_supplier first) - $result=$object->addline($desc, $productsupplier->fourn_pu, $tvatx, $localtax1_tx, $localtax2_tx, $qty, $idprod, $remise_percent, '', '', 0, $npr, $price_base_type, $type, -1, 0, $array_options, $productsupplier->fk_unit); + $result=$object->addline($desc, $productsupplier->fourn_pu, $tvatx, $localtax1_tx, $localtax2_tx, $qty, $idprod, $remise_percent, $date_start, $date_end, 0, $npr, $price_base_type, $type, -1, 0, $array_options, $productsupplier->fk_unit); } if ($idprod == -2 || $idprod == 0) { @@ -757,7 +760,7 @@ if (empty($reshook)) $price_base_type = 'HT'; } - $result=$object->addline($product_desc, $ht, $tva_tx, $localtax1_tx, $localtax2_tx, $qty, 0, $remise_percent, $datestart, $dateend, 0, $npr, $price_base_type, $type, -1, 0, $array_options, $fk_unit); + $result=$object->addline($product_desc, $ht, $tva_tx, $localtax1_tx, $localtax2_tx, $qty, 0, $remise_percent, $date_start, $date_end, 0, $npr, $price_base_type, $type, -1, 0, $array_options, $fk_unit); } //print "xx".$tva_tx; exit; From 771f7183d4697040467e663481680548fc67fd0c Mon Sep 17 00:00:00 2001 From: BENKE Charlie Date: Mon, 7 Dec 2015 10:56:37 +0100 Subject: [PATCH 153/206] db close must do AFTER llxFooter() call --- htdocs/admin/fichinter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/fichinter.php b/htdocs/admin/fichinter.php index 103ba462607..50d2bf3cead 100644 --- a/htdocs/admin/fichinter.php +++ b/htdocs/admin/fichinter.php @@ -576,6 +576,6 @@ print ''; print '
'; +llxFooter(); $db->close(); -llxFooter(); From c60178c95f77914f6b1f71ae9eea960460aac8a1 Mon Sep 17 00:00:00 2001 From: BENKE Charlie Date: Mon, 7 Dec 2015 11:00:26 +0100 Subject: [PATCH 154/206] db close must do AFTER llxFooter() call --- htdocs/admin/supplier_proposal.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/htdocs/admin/supplier_proposal.php b/htdocs/admin/supplier_proposal.php index 64122636a08..c10592487da 100644 --- a/htdocs/admin/supplier_proposal.php +++ b/htdocs/admin/supplier_proposal.php @@ -603,7 +603,6 @@ print " ".$langs->trans("Value")."\n"; print "\n"; print "\n ".$langs->trans("PathDirectory")."\n ".$conf->supplier_proposal->dir_output."\n\n"; print "\n
"; - +llxFooter(); $db->close(); -llxFooter(); From 63fd4cd6c0223d2321041bb4832f177439180827 Mon Sep 17 00:00:00 2001 From: BENKE Charlie Date: Mon, 7 Dec 2015 11:01:48 +0100 Subject: [PATCH 155/206] db close must do AFTER llxFooter() call --- htdocs/bookmarks/list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/bookmarks/list.php b/htdocs/bookmarks/list.php index 425ae0079b6..66b94896424 100644 --- a/htdocs/bookmarks/list.php +++ b/htdocs/bookmarks/list.php @@ -218,7 +218,7 @@ if ($user->rights->bookmark->creer) print '
'; - +llxFooter(); $db->close(); -llxFooter(); + From bcf6c1243c5d4caa0d00737739008f70f6191f2c Mon Sep 17 00:00:00 2001 From: BENKE Charlie Date: Mon, 7 Dec 2015 11:03:27 +0100 Subject: [PATCH 156/206] db close must do AFTER llxFooter() call --- htdocs/admin/livraison.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/livraison.php b/htdocs/admin/livraison.php index ec00cc7233c..f9cee8a75f3 100644 --- a/htdocs/admin/livraison.php +++ b/htdocs/admin/livraison.php @@ -521,6 +521,6 @@ print ''; print ''; +llxFooter(); $db->close(); -llxFooter(); From 9d0f096e475b69789cd6f4370efa5d727fc48b4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 7 Dec 2015 11:46:47 +0100 Subject: [PATCH 157/206] Update paypal.lib.php --- htdocs/paypal/lib/paypal.lib.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/paypal/lib/paypal.lib.php b/htdocs/paypal/lib/paypal.lib.php index 824f312a9af..045863c2c4f 100644 --- a/htdocs/paypal/lib/paypal.lib.php +++ b/htdocs/paypal/lib/paypal.lib.php @@ -702,8 +702,10 @@ function hash_call($methodName,$nvpStr) exit;*/ curl_setopt($ch, CURLOPT_URL, $API_Endpoint); curl_setopt($ch, CURLOPT_VERBOSE, 1); - //curl_setopt($ch, CURLOPT_SSLVERSION, 3); // Force SSLv3 + //curl_setopt($ch, CURLOPT_SSLVERSION, 3); // unsecure, no more accepted curl_setopt($ch, CURLOPT_SSLVERSION, 1); // Force TLSv1 + // After 14 january 2016 paypal will accept tls v1.2 and no more tls v1 + //curl_setopt($ch, CURLOPT_SSLVERSION, 6); // Force TLSv1.2 //turning off the server and peer verification(TrustManager Concept). curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); From 5dfa9ba3699057e48cbb53b4eb4ab556bdcc3cef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 7 Dec 2015 13:39:45 +0100 Subject: [PATCH 158/206] Updated TCPDF to 6.2.12 --- COPYRIGHT | 2 +- composer.json | 2 +- composer.lock | 21 +- .../includes/tecnickcom/tcpdf/CHANGELOG.TXT | 21 + htdocs/includes/tecnickcom/tcpdf/README.TXT | 8 +- .../includes/tecnickcom/tcpdf/composer.json | 4 +- .../tcpdf/include/barcodes/qrcode.php | 1 + .../tecnickcom/tcpdf/include/tcpdf_fonts.php | 274 +-- .../tecnickcom/tcpdf/include/tcpdf_images.php | 11 +- .../tecnickcom/tcpdf/include/tcpdf_static.php | 1496 +++++++++-------- htdocs/includes/tecnickcom/tcpdf/tcpdf.php | 37 +- .../tecnickcom/tcpdf/tcpdf_parser.php | 7 +- 12 files changed, 1029 insertions(+), 855 deletions(-) diff --git a/COPYRIGHT b/COPYRIGHT index 9b848744a69..a0cf842b885 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -28,7 +28,7 @@ php-iban 1.4.7 LGPL-3+ Yes PHPoAuthLib 0.8.2 MIT License Yes Library to provide oauth1 and oauth2 to different service PHPPrintIPP 1.3 GPL-2+ Yes Library to send print IPP requests Restler 3.0 LGPL-3+ Yes Library to develop REST Web services -TCPDF 6.2.6 LGPL-3+ Yes PDF generation +TCPDF 6.2.12 LGPL-3+ Yes PDF generation TCPDI 1.0.0 LGPL-3+ / Apache 2.0 Yes FPDI replacement JS libraries: diff --git a/composer.json b/composer.json index 9061efb3bfe..afd53001f71 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ "mobiledetect/mobiledetectlib": "2.8.3", "phpoffice/phpexcel": "1.8.1", "restler/framework": "^3.0", - "tecnickcom/tcpdf": "6.2.6", + "tecnickcom/tcpdf": "6.2.12", "raven/raven": "^0.12.0", "firephp/firephp-core": "^0.4.0" }, diff --git a/composer.lock b/composer.lock index 99bf8d6fa10..fc8df3719ac 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "335eb7bd5c2eb116fd2da80b4f48e857", + "hash": "e4ff9778aef8c35c239457e96b32ee5c", + "content-hash": "e98d327da132b265127ad23d79a49578", "packages": [ { "name": "ccampbell/chromephp", @@ -132,12 +133,12 @@ "source": { "type": "git", "url": "https://github.com/mike42/escpos-php.git", - "reference": "0564ff94de45564221eca99c4cd5ab24492894c2" + "reference": "63648d03d47b81e8f6c1020ac92f051a3f3b5793" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mike42/escpos-php/zipball/0564ff94de45564221eca99c4cd5ab24492894c2", - "reference": "0564ff94de45564221eca99c4cd5ab24492894c2", + "url": "https://api.github.com/repos/mike42/escpos-php/zipball/63648d03d47b81e8f6c1020ac92f051a3f3b5793", + "reference": "63648d03d47b81e8f6c1020ac92f051a3f3b5793", "shasum": "" }, "require": { @@ -182,7 +183,7 @@ "print", "receipt" ], - "time": "2015-11-02 10:50:46" + "time": "2015-12-04 10:23:55" }, { "name": "mobiledetect/mobiledetectlib", @@ -423,16 +424,16 @@ }, { "name": "tecnickcom/tcpdf", - "version": "6.2.6", + "version": "6.2.12", "source": { "type": "git", "url": "https://github.com/tecnickcom/TCPDF.git", - "reference": "a2e8f5b505a7a14a4ed960313c4baf699fd1f4bb" + "reference": "2f732eaa91b5665274689b1d40b285a7bacdc37f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/a2e8f5b505a7a14a4ed960313c4baf699fd1f4bb", - "reference": "a2e8f5b505a7a14a4ed960313c4baf699fd1f4bb", + "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/2f732eaa91b5665274689b1d40b285a7bacdc37f", + "reference": "2f732eaa91b5665274689b1d40b285a7bacdc37f", "shasum": "" }, "require": { @@ -482,7 +483,7 @@ "pdf417", "qrcode" ], - "time": "2015-01-28 18:51:40" + "time": "2015-09-12 10:08:34" } ], "packages-dev": [], diff --git a/htdocs/includes/tecnickcom/tcpdf/CHANGELOG.TXT b/htdocs/includes/tecnickcom/tcpdf/CHANGELOG.TXT index 2cfb85ae6ab..31b587b2842 100644 --- a/htdocs/includes/tecnickcom/tcpdf/CHANGELOG.TXT +++ b/htdocs/includes/tecnickcom/tcpdf/CHANGELOG.TXT @@ -1,3 +1,24 @@ +6.2.12 (2015-09-12) + - fix composer package name to tecnickcom/tcpdf + +6.2.11 (2015-08-02) + - Bug #1070 "PNG regression in 6.2.9 (they appear as their alpha channel)" was fixed. + - Bug #1069 "Encoded SRC URLs in tags don't work anymore" was fixed. + +6.2.10 (2015-07-28) + - Minor mod to PNG parsing. + - Make dependency on mcrypt optional. + +6.2.8 (2015-04-29) + - Removed unwanted file. + +6.2.7 (2015-04-28) + - Merged PR 17: Avoid warning when iterating a non-array variable. + - Merged PR 16: Improve MuliCell param definition. + - Improved column check (PR 15). + - Merged PR 11: Use stream_is_local instead of limit to file://. + - Merged PR 10: ImageMagick link on README.txt. + 6.2.6 (2015-01-28) - Bug #1008 "UTC offset sing breaks PDF/A-1b compliance" was fixed. diff --git a/htdocs/includes/tecnickcom/tcpdf/README.TXT b/htdocs/includes/tecnickcom/tcpdf/README.TXT index d051393caa2..2061fa7a16b 100644 --- a/htdocs/includes/tecnickcom/tcpdf/README.TXT +++ b/htdocs/includes/tecnickcom/tcpdf/README.TXT @@ -4,12 +4,13 @@ TCPDF - README I WISH TO IMPROVE AND EXPAND TCPDF BUT I NEED YOUR SUPPORT. PLEASE MAKE A DONATION: http://sourceforge.net/donate/index.php?group_id=128076 +or via PayPal at paypal@tecnick.com ------------------------------------------------------------ Name: TCPDF -Version: 6.2.6 -Release date: 2015-01-28 +Version: 6.2.12 +Release date: 2015-09-12 Author: Nicola Asuni Copyright (c) 2002-2015: @@ -20,6 +21,7 @@ Copyright (c) 2002-2015: URLs: http://www.tcpdf.org http://www.sourceforge.net/projects/tcpdf + https://github.com/tecnickcom/TCPDF Description: TCPDF is a PHP class for generating PDF files on-the-fly without requiring external extensions. @@ -34,7 +36,7 @@ Main Features: * font subsetting; * methods to publish some XHTML + CSS code, Javascript and Forms; * images, graphic (geometric figures) and transformation methods; - * supports JPEG, PNG and SVG images natively, all images supported by GD (GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM) and all images supported via ImagMagick (http: www.imagemagick.org/www/formats.html) + * supports JPEG, PNG and SVG images natively, all images supported by GD (GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM) and all images supported via ImagMagick (http://www.imagemagick.org/script/formats.php) * 1D and 2D barcodes: CODE 39, ANSI MH10.8M-1983, USD-3, 3 of 9, CODE 93, USS-93, Standard 2 of 5, Interleaved 2 of 5, CODE 128 A/B/C, 2 and 5 Digits UPC-Based Extension, EAN 8, EAN 13, UPC-A, UPC-E, MSI, POSTNET, PLANET, RMS4CC (Royal Mail 4-state Customer Code), CBC (Customer Bar Code), KIX (Klant index - Customer index), Intelligent Mail Barcode, Onecode, USPS-B-3200, CODABAR, CODE 11, PHARMACODE, PHARMACODE TWO-TRACKS, Datamatrix, QR-Code, PDF417; * JPEG and PNG ICC profiles, Grayscale, RGB, CMYK, Spot Colors and Transparencies; * automatic page header and footer management; diff --git a/htdocs/includes/tecnickcom/tcpdf/composer.json b/htdocs/includes/tecnickcom/tcpdf/composer.json index ba0520d19da..beab50943a6 100644 --- a/htdocs/includes/tecnickcom/tcpdf/composer.json +++ b/htdocs/includes/tecnickcom/tcpdf/composer.json @@ -1,6 +1,6 @@ { - "name": "tecnick.com/tcpdf", - "version": "6.2.6", + "name": "tecnickcom/tcpdf", + "version": "6.2.12", "homepage": "http://www.tcpdf.org/", "type": "library", "description": "TCPDF is a PHP class for generating PDF documents and barcodes.", diff --git a/htdocs/includes/tecnickcom/tcpdf/include/barcodes/qrcode.php b/htdocs/includes/tecnickcom/tcpdf/include/barcodes/qrcode.php index 3127fe68739..7ef2759fd6f 100644 --- a/htdocs/includes/tecnickcom/tcpdf/include/barcodes/qrcode.php +++ b/htdocs/includes/tecnickcom/tcpdf/include/barcodes/qrcode.php @@ -720,6 +720,7 @@ class QRcode { protected function encodeMask($mask) { $spec = array(0, 0, 0, 0, 0); $this->datacode = $this->getByteStream($this->items); + if (is_null($this->datacode)) { return NULL; } diff --git a/htdocs/includes/tecnickcom/tcpdf/include/tcpdf_fonts.php b/htdocs/includes/tecnickcom/tcpdf/include/tcpdf_fonts.php index 0a19f330149..70ca89393d9 100644 --- a/htdocs/includes/tecnickcom/tcpdf/include/tcpdf_fonts.php +++ b/htdocs/includes/tecnickcom/tcpdf/include/tcpdf_fonts.php @@ -154,7 +154,7 @@ class TCPDF_FONTS { $enc_target = TCPDF_FONT_DATA::$encmap[$enc]; $last = 0; for ($i = 32; $i <= 255; ++$i) { - if ($enc_target != $enc_ref[$i]) { + if ($enc_target[$i] != $enc_ref[$i]) { if ($i != ($last + 1)) { $fmetric['diff'] .= $i.' '; } @@ -1490,6 +1490,171 @@ class TCPDF_FONTS { return '/W ['.$w.' ]'; } + + + + /** + * Update the CIDToGIDMap string with a new value. + * @param $map (string) CIDToGIDMap. + * @param $cid (int) CID value. + * @param $gid (int) GID value. + * @return (string) CIDToGIDMap. + * @author Nicola Asuni + * @since 5.9.123 (2011-09-29) + * @public static + */ + public static function updateCIDtoGIDmap($map, $cid, $gid) { + if (($cid >= 0) AND ($cid <= 0xFFFF) AND ($gid >= 0)) { + if ($gid > 0xFFFF) { + $gid -= 0x10000; + } + $map[($cid * 2)] = chr($gid >> 8); + $map[(($cid * 2) + 1)] = chr($gid & 0xFF); + } + return $map; + } + + /** + * Return fonts path + * @return string + * @public static + */ + public static function _getfontpath() { + if (!defined('K_PATH_FONTS') AND is_dir($fdir = realpath(dirname(__FILE__).'/../fonts'))) { + if (substr($fdir, -1) != '/') { + $fdir .= '/'; + } + define('K_PATH_FONTS', $fdir); + } + return defined('K_PATH_FONTS') ? K_PATH_FONTS : ''; + } + + + + /** + * Return font full path + * @param $file (string) Font file name. + * @param $fontdir (string) Font directory (set to false fto search on default directories) + * @return string Font full path or empty string + * @author Nicola Asuni + * @since 6.0.025 + * @public static + */ + public static function getFontFullPath($file, $fontdir=false) { + $fontfile = ''; + // search files on various directories + if (($fontdir !== false) AND @file_exists($fontdir.$file)) { + $fontfile = $fontdir.$file; + } elseif (@file_exists(self::_getfontpath().$file)) { + $fontfile = self::_getfontpath().$file; + } elseif (@file_exists($file)) { + $fontfile = $file; + } + return $fontfile; + } + + + + + /** + * Get a reference font size. + * @param $size (string) String containing font size value. + * @param $refsize (float) Reference font size in points. + * @return float value in points + * @public static + */ + public static function getFontRefSize($size, $refsize=12) { + switch ($size) { + case 'xx-small': { + $size = ($refsize - 4); + break; + } + case 'x-small': { + $size = ($refsize - 3); + break; + } + case 'small': { + $size = ($refsize - 2); + break; + } + case 'medium': { + $size = $refsize; + break; + } + case 'large': { + $size = ($refsize + 2); + break; + } + case 'x-large': { + $size = ($refsize + 4); + break; + } + case 'xx-large': { + $size = ($refsize + 6); + break; + } + case 'smaller': { + $size = ($refsize - 3); + break; + } + case 'larger': { + $size = ($refsize + 3); + break; + } + } + return $size; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// ==================================================================================================================== +// REIMPLEMENTED +// ==================================================================================================================== + + + + + + + + /** * Returns the unicode caracter specified by the value * @param $c (int) UTF-8 value @@ -1663,64 +1828,6 @@ class TCPDF_FONTS { return $string; } - /** - * Update the CIDToGIDMap string with a new value. - * @param $map (string) CIDToGIDMap. - * @param $cid (int) CID value. - * @param $gid (int) GID value. - * @return (string) CIDToGIDMap. - * @author Nicola Asuni - * @since 5.9.123 (2011-09-29) - * @public static - */ - public static function updateCIDtoGIDmap($map, $cid, $gid) { - if (($cid >= 0) AND ($cid <= 0xFFFF) AND ($gid >= 0)) { - if ($gid > 0xFFFF) { - $gid -= 0x10000; - } - $map[($cid * 2)] = chr($gid >> 8); - $map[(($cid * 2) + 1)] = chr($gid & 0xFF); - } - return $map; - } - - /** - * Return fonts path - * @return string - * @public static - */ - public static function _getfontpath() { - if (!defined('K_PATH_FONTS') AND is_dir($fdir = realpath(dirname(__FILE__).'/../fonts'))) { - if (substr($fdir, -1) != '/') { - $fdir .= '/'; - } - define('K_PATH_FONTS', $fdir); - } - return defined('K_PATH_FONTS') ? K_PATH_FONTS : ''; - } - - /** - * Return font full path - * @param $file (string) Font file name. - * @param $fontdir (string) Font directory (set to false fto search on default directories) - * @return string Font full path or empty string - * @author Nicola Asuni - * @since 6.0.025 - * @public static - */ - public static function getFontFullPath($file, $fontdir=false) { - $fontfile = ''; - // search files on various directories - if (($fontdir !== false) AND @file_exists($fontdir.$file)) { - $fontfile = $fontdir.$file; - } elseif (@file_exists(self::_getfontpath().$file)) { - $fontfile = self::_getfontpath().$file; - } elseif (@file_exists($file)) { - $fontfile = $file; - } - return $fontfile; - } - /** * Converts UTF-8 characters array to array of Latin1 characters array
* @param $unicode (array) array containing UTF-8 unicode values @@ -2535,55 +2642,6 @@ class TCPDF_FONTS { return $ordarray; } - /** - * Get a reference font size. - * @param $size (string) String containing font size value. - * @param $refsize (float) Reference font size in points. - * @return float value in points - * @public static - */ - public static function getFontRefSize($size, $refsize=12) { - switch ($size) { - case 'xx-small': { - $size = ($refsize - 4); - break; - } - case 'x-small': { - $size = ($refsize - 3); - break; - } - case 'small': { - $size = ($refsize - 2); - break; - } - case 'medium': { - $size = $refsize; - break; - } - case 'large': { - $size = ($refsize + 2); - break; - } - case 'x-large': { - $size = ($refsize + 4); - break; - } - case 'xx-large': { - $size = ($refsize + 6); - break; - } - case 'smaller': { - $size = ($refsize - 3); - break; - } - case 'larger': { - $size = ($refsize + 3); - break; - } - } - return $size; - } - } // END OF TCPDF_FONTS CLASS //============================================================+ diff --git a/htdocs/includes/tecnickcom/tcpdf/include/tcpdf_images.php b/htdocs/includes/tecnickcom/tcpdf/include/tcpdf_images.php index c7ae9bd9677..c2e3c36f930 100644 --- a/htdocs/includes/tecnickcom/tcpdf/include/tcpdf_images.php +++ b/htdocs/includes/tecnickcom/tcpdf/include/tcpdf_images.php @@ -160,6 +160,14 @@ class TCPDF_IMAGES { * @public static */ public static function _parsejpeg($file) { + // check if is a local file + if (!@file_exists($file)) { + // try to encode spaces on filename + $tfile = str_replace(' ', '%20', $file); + if (@file_exists($tfile)) { + $file = $tfile; + } + } $a = getimagesize($file); if (empty($a)) { //Missing or incorrect image file @@ -289,8 +297,8 @@ class TCPDF_IMAGES { $trns = ''; $data = ''; $icc = false; + $n = TCPDF_STATIC::_freadint($f); do { - $n = TCPDF_STATIC::_freadint($f); $type = fread($f, 4); if ($type == 'PLTE') { // read palette @@ -338,6 +346,7 @@ class TCPDF_IMAGES { } else { TCPDF_STATIC::rfread($f, $n + 4); } + $n = TCPDF_STATIC::_freadint($f); } while ($n); if (($colspace == 'Indexed') AND (empty($pal))) { // Missing palette diff --git a/htdocs/includes/tecnickcom/tcpdf/include/tcpdf_static.php b/htdocs/includes/tecnickcom/tcpdf/include/tcpdf_static.php index e947832d24a..f6d4d2b9eb4 100644 --- a/htdocs/includes/tecnickcom/tcpdf/include/tcpdf_static.php +++ b/htdocs/includes/tecnickcom/tcpdf/include/tcpdf_static.php @@ -1,9 +1,9 @@ array( 2383.937, 3370.394), // = ( 841 x 1189 ) mm = ( 33.11 x 46.81 ) in - 'A1' => array( 1683.780, 2383.937), // = ( 594 x 841 ) mm = ( 23.39 x 33.11 ) in - 'A2' => array( 1190.551, 1683.780), // = ( 420 x 594 ) mm = ( 16.54 x 23.39 ) in - 'A3' => array( 841.890, 1190.551), // = ( 297 x 420 ) mm = ( 11.69 x 16.54 ) in - 'A4' => array( 595.276, 841.890), // = ( 210 x 297 ) mm = ( 8.27 x 11.69 ) in - 'A5' => array( 419.528, 595.276), // = ( 148 x 210 ) mm = ( 5.83 x 8.27 ) in - 'A6' => array( 297.638, 419.528), // = ( 105 x 148 ) mm = ( 4.13 x 5.83 ) in - 'A7' => array( 209.764, 297.638), // = ( 74 x 105 ) mm = ( 2.91 x 4.13 ) in - 'A8' => array( 147.402, 209.764), // = ( 52 x 74 ) mm = ( 2.05 x 2.91 ) in - 'A9' => array( 104.882, 147.402), // = ( 37 x 52 ) mm = ( 1.46 x 2.05 ) in - 'A10' => array( 73.701, 104.882), // = ( 26 x 37 ) mm = ( 1.02 x 1.46 ) in - 'A11' => array( 51.024, 73.701), // = ( 18 x 26 ) mm = ( 0.71 x 1.02 ) in - 'A12' => array( 36.850, 51.024), // = ( 13 x 18 ) mm = ( 0.51 x 0.71 ) in - // ISO 216 B Series + 2 SIS 014711 extensions - 'B0' => array( 2834.646, 4008.189), // = ( 1000 x 1414 ) mm = ( 39.37 x 55.67 ) in - 'B1' => array( 2004.094, 2834.646), // = ( 707 x 1000 ) mm = ( 27.83 x 39.37 ) in - 'B2' => array( 1417.323, 2004.094), // = ( 500 x 707 ) mm = ( 19.69 x 27.83 ) in - 'B3' => array( 1000.630, 1417.323), // = ( 353 x 500 ) mm = ( 13.90 x 19.69 ) in - 'B4' => array( 708.661, 1000.630), // = ( 250 x 353 ) mm = ( 9.84 x 13.90 ) in - 'B5' => array( 498.898, 708.661), // = ( 176 x 250 ) mm = ( 6.93 x 9.84 ) in - 'B6' => array( 354.331, 498.898), // = ( 125 x 176 ) mm = ( 4.92 x 6.93 ) in - 'B7' => array( 249.449, 354.331), // = ( 88 x 125 ) mm = ( 3.46 x 4.92 ) in - 'B8' => array( 175.748, 249.449), // = ( 62 x 88 ) mm = ( 2.44 x 3.46 ) in - 'B9' => array( 124.724, 175.748), // = ( 44 x 62 ) mm = ( 1.73 x 2.44 ) in - 'B10' => array( 87.874, 124.724), // = ( 31 x 44 ) mm = ( 1.22 x 1.73 ) in - 'B11' => array( 62.362, 87.874), // = ( 22 x 31 ) mm = ( 0.87 x 1.22 ) in - 'B12' => array( 42.520, 62.362), // = ( 15 x 22 ) mm = ( 0.59 x 0.87 ) in - // ISO 216 C Series + 2 SIS 014711 extensions + 5 EXTENSION - 'C0' => array( 2599.370, 3676.535), // = ( 917 x 1297 ) mm = ( 36.10 x 51.06 ) in - 'C1' => array( 1836.850, 2599.370), // = ( 648 x 917 ) mm = ( 25.51 x 36.10 ) in - 'C2' => array( 1298.268, 1836.850), // = ( 458 x 648 ) mm = ( 18.03 x 25.51 ) in - 'C3' => array( 918.425, 1298.268), // = ( 324 x 458 ) mm = ( 12.76 x 18.03 ) in - 'C4' => array( 649.134, 918.425), // = ( 229 x 324 ) mm = ( 9.02 x 12.76 ) in - 'C5' => array( 459.213, 649.134), // = ( 162 x 229 ) mm = ( 6.38 x 9.02 ) in - 'C6' => array( 323.150, 459.213), // = ( 114 x 162 ) mm = ( 4.49 x 6.38 ) in - 'C7' => array( 229.606, 323.150), // = ( 81 x 114 ) mm = ( 3.19 x 4.49 ) in - 'C8' => array( 161.575, 229.606), // = ( 57 x 81 ) mm = ( 2.24 x 3.19 ) in - 'C9' => array( 113.386, 161.575), // = ( 40 x 57 ) mm = ( 1.57 x 2.24 ) in - 'C10' => array( 79.370, 113.386), // = ( 28 x 40 ) mm = ( 1.10 x 1.57 ) in - 'C11' => array( 56.693, 79.370), // = ( 20 x 28 ) mm = ( 0.79 x 1.10 ) in - 'C12' => array( 39.685, 56.693), // = ( 14 x 20 ) mm = ( 0.55 x 0.79 ) in - 'C76' => array( 229.606, 459.213), // = ( 81 x 162 ) mm = ( 3.19 x 6.38 ) in - 'DL' => array( 311.811, 623.622), // = ( 110 x 220 ) mm = ( 4.33 x 8.66 ) in - 'DLE' => array( 323.150, 637.795), // = ( 114 x 225 ) mm = ( 4.49 x 8.86 ) in - 'DLX' => array( 340.158, 666.142), // = ( 120 x 235 ) mm = ( 4.72 x 9.25 ) in - 'DLP' => array( 280.630, 595.276), // = ( 99 x 210 ) mm = ( 3.90 x 8.27 ) in (1/3 A4) - // SIS 014711 E Series - 'E0' => array( 2491.654, 3517.795), // = ( 879 x 1241 ) mm = ( 34.61 x 48.86 ) in - 'E1' => array( 1757.480, 2491.654), // = ( 620 x 879 ) mm = ( 24.41 x 34.61 ) in - 'E2' => array( 1247.244, 1757.480), // = ( 440 x 620 ) mm = ( 17.32 x 24.41 ) in - 'E3' => array( 878.740, 1247.244), // = ( 310 x 440 ) mm = ( 12.20 x 17.32 ) in - 'E4' => array( 623.622, 878.740), // = ( 220 x 310 ) mm = ( 8.66 x 12.20 ) in - 'E5' => array( 439.370, 623.622), // = ( 155 x 220 ) mm = ( 6.10 x 8.66 ) in - 'E6' => array( 311.811, 439.370), // = ( 110 x 155 ) mm = ( 4.33 x 6.10 ) in - 'E7' => array( 221.102, 311.811), // = ( 78 x 110 ) mm = ( 3.07 x 4.33 ) in - 'E8' => array( 155.906, 221.102), // = ( 55 x 78 ) mm = ( 2.17 x 3.07 ) in - 'E9' => array( 110.551, 155.906), // = ( 39 x 55 ) mm = ( 1.54 x 2.17 ) in - 'E10' => array( 76.535, 110.551), // = ( 27 x 39 ) mm = ( 1.06 x 1.54 ) in - 'E11' => array( 53.858, 76.535), // = ( 19 x 27 ) mm = ( 0.75 x 1.06 ) in - 'E12' => array( 36.850, 53.858), // = ( 13 x 19 ) mm = ( 0.51 x 0.75 ) in - // SIS 014711 G Series - 'G0' => array( 2715.591, 3838.110), // = ( 958 x 1354 ) mm = ( 37.72 x 53.31 ) in - 'G1' => array( 1919.055, 2715.591), // = ( 677 x 958 ) mm = ( 26.65 x 37.72 ) in - 'G2' => array( 1357.795, 1919.055), // = ( 479 x 677 ) mm = ( 18.86 x 26.65 ) in - 'G3' => array( 958.110, 1357.795), // = ( 338 x 479 ) mm = ( 13.31 x 18.86 ) in - 'G4' => array( 677.480, 958.110), // = ( 239 x 338 ) mm = ( 9.41 x 13.31 ) in - 'G5' => array( 479.055, 677.480), // = ( 169 x 239 ) mm = ( 6.65 x 9.41 ) in - 'G6' => array( 337.323, 479.055), // = ( 119 x 169 ) mm = ( 4.69 x 6.65 ) in - 'G7' => array( 238.110, 337.323), // = ( 84 x 119 ) mm = ( 3.31 x 4.69 ) in - 'G8' => array( 167.244, 238.110), // = ( 59 x 84 ) mm = ( 2.32 x 3.31 ) in - 'G9' => array( 119.055, 167.244), // = ( 42 x 59 ) mm = ( 1.65 x 2.32 ) in - 'G10' => array( 82.205, 119.055), // = ( 29 x 42 ) mm = ( 1.14 x 1.65 ) in - 'G11' => array( 59.528, 82.205), // = ( 21 x 29 ) mm = ( 0.83 x 1.14 ) in - 'G12' => array( 39.685, 59.528), // = ( 14 x 21 ) mm = ( 0.55 x 0.83 ) in - // ISO Press - 'RA0' => array( 2437.795, 3458.268), // = ( 860 x 1220 ) mm = ( 33.86 x 48.03 ) in - 'RA1' => array( 1729.134, 2437.795), // = ( 610 x 860 ) mm = ( 24.02 x 33.86 ) in - 'RA2' => array( 1218.898, 1729.134), // = ( 430 x 610 ) mm = ( 16.93 x 24.02 ) in - 'RA3' => array( 864.567, 1218.898), // = ( 305 x 430 ) mm = ( 12.01 x 16.93 ) in - 'RA4' => array( 609.449, 864.567), // = ( 215 x 305 ) mm = ( 8.46 x 12.01 ) in - 'SRA0' => array( 2551.181, 3628.346), // = ( 900 x 1280 ) mm = ( 35.43 x 50.39 ) in - 'SRA1' => array( 1814.173, 2551.181), // = ( 640 x 900 ) mm = ( 25.20 x 35.43 ) in - 'SRA2' => array( 1275.591, 1814.173), // = ( 450 x 640 ) mm = ( 17.72 x 25.20 ) in - 'SRA3' => array( 907.087, 1275.591), // = ( 320 x 450 ) mm = ( 12.60 x 17.72 ) in - 'SRA4' => array( 637.795, 907.087), // = ( 225 x 320 ) mm = ( 8.86 x 12.60 ) in - // German DIN 476 - '4A0' => array( 4767.874, 6740.787), // = ( 1682 x 2378 ) mm = ( 66.22 x 93.62 ) in - '2A0' => array( 3370.394, 4767.874), // = ( 1189 x 1682 ) mm = ( 46.81 x 66.22 ) in - // Variations on the ISO Standard - 'A2_EXTRA' => array( 1261.417, 1754.646), // = ( 445 x 619 ) mm = ( 17.52 x 24.37 ) in - 'A3+' => array( 932.598, 1369.134), // = ( 329 x 483 ) mm = ( 12.95 x 19.02 ) in - 'A3_EXTRA' => array( 912.756, 1261.417), // = ( 322 x 445 ) mm = ( 12.68 x 17.52 ) in - 'A3_SUPER' => array( 864.567, 1440.000), // = ( 305 x 508 ) mm = ( 12.01 x 20.00 ) in - 'SUPER_A3' => array( 864.567, 1380.472), // = ( 305 x 487 ) mm = ( 12.01 x 19.17 ) in - 'A4_EXTRA' => array( 666.142, 912.756), // = ( 235 x 322 ) mm = ( 9.25 x 12.68 ) in - 'A4_SUPER' => array( 649.134, 912.756), // = ( 229 x 322 ) mm = ( 9.02 x 12.68 ) in - 'SUPER_A4' => array( 643.465, 1009.134), // = ( 227 x 356 ) mm = ( 8.94 x 14.02 ) in - 'A4_LONG' => array( 595.276, 986.457), // = ( 210 x 348 ) mm = ( 8.27 x 13.70 ) in - 'F4' => array( 595.276, 935.433), // = ( 210 x 330 ) mm = ( 8.27 x 12.99 ) in - 'SO_B5_EXTRA' => array( 572.598, 782.362), // = ( 202 x 276 ) mm = ( 7.95 x 10.87 ) in - 'A5_EXTRA' => array( 490.394, 666.142), // = ( 173 x 235 ) mm = ( 6.81 x 9.25 ) in - // ANSI Series - 'ANSI_E' => array( 2448.000, 3168.000), // = ( 864 x 1118 ) mm = ( 34.00 x 44.00 ) in - 'ANSI_D' => array( 1584.000, 2448.000), // = ( 559 x 864 ) mm = ( 22.00 x 34.00 ) in - 'ANSI_C' => array( 1224.000, 1584.000), // = ( 432 x 559 ) mm = ( 17.00 x 22.00 ) in - 'ANSI_B' => array( 792.000, 1224.000), // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in - 'ANSI_A' => array( 612.000, 792.000), // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in - // Traditional 'Loose' North American Paper Sizes - 'USLEDGER' => array( 1224.000, 792.000), // = ( 432 x 279 ) mm = ( 17.00 x 11.00 ) in - 'LEDGER' => array( 1224.000, 792.000), // = ( 432 x 279 ) mm = ( 17.00 x 11.00 ) in - 'ORGANIZERK' => array( 792.000, 1224.000), // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in - 'BIBLE' => array( 792.000, 1224.000), // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in - 'USTABLOID' => array( 792.000, 1224.000), // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in - 'TABLOID' => array( 792.000, 1224.000), // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in - 'ORGANIZERM' => array( 612.000, 792.000), // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in - 'USLETTER' => array( 612.000, 792.000), // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in - 'LETTER' => array( 612.000, 792.000), // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in - 'USLEGAL' => array( 612.000, 1008.000), // = ( 216 x 356 ) mm = ( 8.50 x 14.00 ) in - 'LEGAL' => array( 612.000, 1008.000), // = ( 216 x 356 ) mm = ( 8.50 x 14.00 ) in - 'GOVERNMENTLETTER' => array( 576.000, 756.000), // = ( 203 x 267 ) mm = ( 8.00 x 10.50 ) in - 'GLETTER' => array( 576.000, 756.000), // = ( 203 x 267 ) mm = ( 8.00 x 10.50 ) in - 'JUNIORLEGAL' => array( 576.000, 360.000), // = ( 203 x 127 ) mm = ( 8.00 x 5.00 ) in - 'JLEGAL' => array( 576.000, 360.000), // = ( 203 x 127 ) mm = ( 8.00 x 5.00 ) in - // Other North American Paper Sizes - 'QUADDEMY' => array( 2520.000, 3240.000), // = ( 889 x 1143 ) mm = ( 35.00 x 45.00 ) in - 'SUPER_B' => array( 936.000, 1368.000), // = ( 330 x 483 ) mm = ( 13.00 x 19.00 ) in - 'QUARTO' => array( 648.000, 792.000), // = ( 229 x 279 ) mm = ( 9.00 x 11.00 ) in - 'GOVERNMENTLEGAL' => array( 612.000, 936.000), // = ( 216 x 330 ) mm = ( 8.50 x 13.00 ) in - 'FOLIO' => array( 612.000, 936.000), // = ( 216 x 330 ) mm = ( 8.50 x 13.00 ) in - 'MONARCH' => array( 522.000, 756.000), // = ( 184 x 267 ) mm = ( 7.25 x 10.50 ) in - 'EXECUTIVE' => array( 522.000, 756.000), // = ( 184 x 267 ) mm = ( 7.25 x 10.50 ) in - 'ORGANIZERL' => array( 396.000, 612.000), // = ( 140 x 216 ) mm = ( 5.50 x 8.50 ) in - 'STATEMENT' => array( 396.000, 612.000), // = ( 140 x 216 ) mm = ( 5.50 x 8.50 ) in - 'MEMO' => array( 396.000, 612.000), // = ( 140 x 216 ) mm = ( 5.50 x 8.50 ) in - 'FOOLSCAP' => array( 595.440, 936.000), // = ( 210 x 330 ) mm = ( 8.27 x 13.00 ) in - 'COMPACT' => array( 306.000, 486.000), // = ( 108 x 171 ) mm = ( 4.25 x 6.75 ) in - 'ORGANIZERJ' => array( 198.000, 360.000), // = ( 70 x 127 ) mm = ( 2.75 x 5.00 ) in - // Canadian standard CAN 2-9.60M - 'P1' => array( 1587.402, 2437.795), // = ( 560 x 860 ) mm = ( 22.05 x 33.86 ) in - 'P2' => array( 1218.898, 1587.402), // = ( 430 x 560 ) mm = ( 16.93 x 22.05 ) in - 'P3' => array( 793.701, 1218.898), // = ( 280 x 430 ) mm = ( 11.02 x 16.93 ) in - 'P4' => array( 609.449, 793.701), // = ( 215 x 280 ) mm = ( 8.46 x 11.02 ) in - 'P5' => array( 396.850, 609.449), // = ( 140 x 215 ) mm = ( 5.51 x 8.46 ) in - 'P6' => array( 303.307, 396.850), // = ( 107 x 140 ) mm = ( 4.21 x 5.51 ) in - // North American Architectural Sizes - 'ARCH_E' => array( 2592.000, 3456.000), // = ( 914 x 1219 ) mm = ( 36.00 x 48.00 ) in - 'ARCH_E1' => array( 2160.000, 3024.000), // = ( 762 x 1067 ) mm = ( 30.00 x 42.00 ) in - 'ARCH_D' => array( 1728.000, 2592.000), // = ( 610 x 914 ) mm = ( 24.00 x 36.00 ) in - 'BROADSHEET' => array( 1296.000, 1728.000), // = ( 457 x 610 ) mm = ( 18.00 x 24.00 ) in - 'ARCH_C' => array( 1296.000, 1728.000), // = ( 457 x 610 ) mm = ( 18.00 x 24.00 ) in - 'ARCH_B' => array( 864.000, 1296.000), // = ( 305 x 457 ) mm = ( 12.00 x 18.00 ) in - 'ARCH_A' => array( 648.000, 864.000), // = ( 229 x 305 ) mm = ( 9.00 x 12.00 ) in - // -- North American Envelope Sizes - // - Announcement Envelopes - 'ANNENV_A2' => array( 314.640, 414.000), // = ( 111 x 146 ) mm = ( 4.37 x 5.75 ) in - 'ANNENV_A6' => array( 342.000, 468.000), // = ( 121 x 165 ) mm = ( 4.75 x 6.50 ) in - 'ANNENV_A7' => array( 378.000, 522.000), // = ( 133 x 184 ) mm = ( 5.25 x 7.25 ) in - 'ANNENV_A8' => array( 396.000, 584.640), // = ( 140 x 206 ) mm = ( 5.50 x 8.12 ) in - 'ANNENV_A10' => array( 450.000, 692.640), // = ( 159 x 244 ) mm = ( 6.25 x 9.62 ) in - 'ANNENV_SLIM' => array( 278.640, 638.640), // = ( 98 x 225 ) mm = ( 3.87 x 8.87 ) in - // - Commercial Envelopes - 'COMMENV_N6_1/4' => array( 252.000, 432.000), // = ( 89 x 152 ) mm = ( 3.50 x 6.00 ) in - 'COMMENV_N6_3/4' => array( 260.640, 468.000), // = ( 92 x 165 ) mm = ( 3.62 x 6.50 ) in - 'COMMENV_N8' => array( 278.640, 540.000), // = ( 98 x 191 ) mm = ( 3.87 x 7.50 ) in - 'COMMENV_N9' => array( 278.640, 638.640), // = ( 98 x 225 ) mm = ( 3.87 x 8.87 ) in - 'COMMENV_N10' => array( 296.640, 684.000), // = ( 105 x 241 ) mm = ( 4.12 x 9.50 ) in - 'COMMENV_N11' => array( 324.000, 746.640), // = ( 114 x 263 ) mm = ( 4.50 x 10.37 ) in - 'COMMENV_N12' => array( 342.000, 792.000), // = ( 121 x 279 ) mm = ( 4.75 x 11.00 ) in - 'COMMENV_N14' => array( 360.000, 828.000), // = ( 127 x 292 ) mm = ( 5.00 x 11.50 ) in - // - Catalogue Envelopes - 'CATENV_N1' => array( 432.000, 648.000), // = ( 152 x 229 ) mm = ( 6.00 x 9.00 ) in - 'CATENV_N1_3/4' => array( 468.000, 684.000), // = ( 165 x 241 ) mm = ( 6.50 x 9.50 ) in - 'CATENV_N2' => array( 468.000, 720.000), // = ( 165 x 254 ) mm = ( 6.50 x 10.00 ) in - 'CATENV_N3' => array( 504.000, 720.000), // = ( 178 x 254 ) mm = ( 7.00 x 10.00 ) in - 'CATENV_N6' => array( 540.000, 756.000), // = ( 191 x 267 ) mm = ( 7.50 x 10.50 ) in - 'CATENV_N7' => array( 576.000, 792.000), // = ( 203 x 279 ) mm = ( 8.00 x 11.00 ) in - 'CATENV_N8' => array( 594.000, 810.000), // = ( 210 x 286 ) mm = ( 8.25 x 11.25 ) in - 'CATENV_N9_1/2' => array( 612.000, 756.000), // = ( 216 x 267 ) mm = ( 8.50 x 10.50 ) in - 'CATENV_N9_3/4' => array( 630.000, 810.000), // = ( 222 x 286 ) mm = ( 8.75 x 11.25 ) in - 'CATENV_N10_1/2' => array( 648.000, 864.000), // = ( 229 x 305 ) mm = ( 9.00 x 12.00 ) in - 'CATENV_N12_1/2' => array( 684.000, 900.000), // = ( 241 x 318 ) mm = ( 9.50 x 12.50 ) in - 'CATENV_N13_1/2' => array( 720.000, 936.000), // = ( 254 x 330 ) mm = ( 10.00 x 13.00 ) in - 'CATENV_N14_1/4' => array( 810.000, 882.000), // = ( 286 x 311 ) mm = ( 11.25 x 12.25 ) in - 'CATENV_N14_1/2' => array( 828.000, 1044.000), // = ( 292 x 368 ) mm = ( 11.50 x 14.50 ) in - // Japanese (JIS P 0138-61) Standard B-Series - 'JIS_B0' => array( 2919.685, 4127.244), // = ( 1030 x 1456 ) mm = ( 40.55 x 57.32 ) in - 'JIS_B1' => array( 2063.622, 2919.685), // = ( 728 x 1030 ) mm = ( 28.66 x 40.55 ) in - 'JIS_B2' => array( 1459.843, 2063.622), // = ( 515 x 728 ) mm = ( 20.28 x 28.66 ) in - 'JIS_B3' => array( 1031.811, 1459.843), // = ( 364 x 515 ) mm = ( 14.33 x 20.28 ) in - 'JIS_B4' => array( 728.504, 1031.811), // = ( 257 x 364 ) mm = ( 10.12 x 14.33 ) in - 'JIS_B5' => array( 515.906, 728.504), // = ( 182 x 257 ) mm = ( 7.17 x 10.12 ) in - 'JIS_B6' => array( 362.835, 515.906), // = ( 128 x 182 ) mm = ( 5.04 x 7.17 ) in - 'JIS_B7' => array( 257.953, 362.835), // = ( 91 x 128 ) mm = ( 3.58 x 5.04 ) in - 'JIS_B8' => array( 181.417, 257.953), // = ( 64 x 91 ) mm = ( 2.52 x 3.58 ) in - 'JIS_B9' => array( 127.559, 181.417), // = ( 45 x 64 ) mm = ( 1.77 x 2.52 ) in - 'JIS_B10' => array( 90.709, 127.559), // = ( 32 x 45 ) mm = ( 1.26 x 1.77 ) in - 'JIS_B11' => array( 62.362, 90.709), // = ( 22 x 32 ) mm = ( 0.87 x 1.26 ) in - 'JIS_B12' => array( 45.354, 62.362), // = ( 16 x 22 ) mm = ( 0.63 x 0.87 ) in - // PA Series - 'PA0' => array( 2381.102, 3174.803), // = ( 840 x 1120 ) mm = ( 33.07 x 44.09 ) in - 'PA1' => array( 1587.402, 2381.102), // = ( 560 x 840 ) mm = ( 22.05 x 33.07 ) in - 'PA2' => array( 1190.551, 1587.402), // = ( 420 x 560 ) mm = ( 16.54 x 22.05 ) in - 'PA3' => array( 793.701, 1190.551), // = ( 280 x 420 ) mm = ( 11.02 x 16.54 ) in - 'PA4' => array( 595.276, 793.701), // = ( 210 x 280 ) mm = ( 8.27 x 11.02 ) in - 'PA5' => array( 396.850, 595.276), // = ( 140 x 210 ) mm = ( 5.51 x 8.27 ) in - 'PA6' => array( 297.638, 396.850), // = ( 105 x 140 ) mm = ( 4.13 x 5.51 ) in - 'PA7' => array( 198.425, 297.638), // = ( 70 x 105 ) mm = ( 2.76 x 4.13 ) in - 'PA8' => array( 147.402, 198.425), // = ( 52 x 70 ) mm = ( 2.05 x 2.76 ) in - 'PA9' => array( 99.213, 147.402), // = ( 35 x 52 ) mm = ( 1.38 x 2.05 ) in - 'PA10' => array( 73.701, 99.213), // = ( 26 x 35 ) mm = ( 1.02 x 1.38 ) in - // Standard Photographic Print Sizes - 'PASSPORT_PHOTO' => array( 99.213, 127.559), // = ( 35 x 45 ) mm = ( 1.38 x 1.77 ) in - 'E' => array( 233.858, 340.157), // = ( 82 x 120 ) mm = ( 3.25 x 4.72 ) in - 'L' => array( 252.283, 360.000), // = ( 89 x 127 ) mm = ( 3.50 x 5.00 ) in - '3R' => array( 252.283, 360.000), // = ( 89 x 127 ) mm = ( 3.50 x 5.00 ) in - 'KG' => array( 289.134, 430.866), // = ( 102 x 152 ) mm = ( 4.02 x 5.98 ) in - '4R' => array( 289.134, 430.866), // = ( 102 x 152 ) mm = ( 4.02 x 5.98 ) in - '4D' => array( 340.157, 430.866), // = ( 120 x 152 ) mm = ( 4.72 x 5.98 ) in - '2L' => array( 360.000, 504.567), // = ( 127 x 178 ) mm = ( 5.00 x 7.01 ) in - '5R' => array( 360.000, 504.567), // = ( 127 x 178 ) mm = ( 5.00 x 7.01 ) in - '8P' => array( 430.866, 575.433), // = ( 152 x 203 ) mm = ( 5.98 x 7.99 ) in - '6R' => array( 430.866, 575.433), // = ( 152 x 203 ) mm = ( 5.98 x 7.99 ) in - '6P' => array( 575.433, 720.000), // = ( 203 x 254 ) mm = ( 7.99 x 10.00 ) in - '8R' => array( 575.433, 720.000), // = ( 203 x 254 ) mm = ( 7.99 x 10.00 ) in - '6PW' => array( 575.433, 864.567), // = ( 203 x 305 ) mm = ( 7.99 x 12.01 ) in - 'S8R' => array( 575.433, 864.567), // = ( 203 x 305 ) mm = ( 7.99 x 12.01 ) in - '4P' => array( 720.000, 864.567), // = ( 254 x 305 ) mm = ( 10.00 x 12.01 ) in - '10R' => array( 720.000, 864.567), // = ( 254 x 305 ) mm = ( 10.00 x 12.01 ) in - '4PW' => array( 720.000, 1080.000), // = ( 254 x 381 ) mm = ( 10.00 x 15.00 ) in - 'S10R' => array( 720.000, 1080.000), // = ( 254 x 381 ) mm = ( 10.00 x 15.00 ) in - '11R' => array( 790.866, 1009.134), // = ( 279 x 356 ) mm = ( 10.98 x 14.02 ) in - 'S11R' => array( 790.866, 1224.567), // = ( 279 x 432 ) mm = ( 10.98 x 17.01 ) in - '12R' => array( 864.567, 1080.000), // = ( 305 x 381 ) mm = ( 12.01 x 15.00 ) in - 'S12R' => array( 864.567, 1292.598), // = ( 305 x 456 ) mm = ( 12.01 x 17.95 ) in - // Common Newspaper Sizes - 'NEWSPAPER_BROADSHEET' => array( 2125.984, 1700.787), // = ( 750 x 600 ) mm = ( 29.53 x 23.62 ) in - 'NEWSPAPER_BERLINER' => array( 1332.283, 892.913), // = ( 470 x 315 ) mm = ( 18.50 x 12.40 ) in - 'NEWSPAPER_TABLOID' => array( 1218.898, 793.701), // = ( 430 x 280 ) mm = ( 16.93 x 11.02 ) in - 'NEWSPAPER_COMPACT' => array( 1218.898, 793.701), // = ( 430 x 280 ) mm = ( 16.93 x 11.02 ) in - // Business Cards - 'CREDIT_CARD' => array( 153.014, 242.646), // = ( 54 x 86 ) mm = ( 2.13 x 3.37 ) in - 'BUSINESS_CARD' => array( 153.014, 242.646), // = ( 54 x 86 ) mm = ( 2.13 x 3.37 ) in - 'BUSINESS_CARD_ISO7810' => array( 153.014, 242.646), // = ( 54 x 86 ) mm = ( 2.13 x 3.37 ) in - 'BUSINESS_CARD_ISO216' => array( 147.402, 209.764), // = ( 52 x 74 ) mm = ( 2.05 x 2.91 ) in - 'BUSINESS_CARD_IT' => array( 155.906, 240.945), // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in - 'BUSINESS_CARD_UK' => array( 155.906, 240.945), // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in - 'BUSINESS_CARD_FR' => array( 155.906, 240.945), // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in - 'BUSINESS_CARD_DE' => array( 155.906, 240.945), // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in - 'BUSINESS_CARD_ES' => array( 155.906, 240.945), // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in - 'BUSINESS_CARD_CA' => array( 144.567, 252.283), // = ( 51 x 89 ) mm = ( 2.01 x 3.50 ) in - 'BUSINESS_CARD_US' => array( 144.567, 252.283), // = ( 51 x 89 ) mm = ( 2.01 x 3.50 ) in - 'BUSINESS_CARD_JP' => array( 155.906, 257.953), // = ( 55 x 91 ) mm = ( 2.17 x 3.58 ) in - 'BUSINESS_CARD_HK' => array( 153.071, 255.118), // = ( 54 x 90 ) mm = ( 2.13 x 3.54 ) in - 'BUSINESS_CARD_AU' => array( 155.906, 255.118), // = ( 55 x 90 ) mm = ( 2.17 x 3.54 ) in - 'BUSINESS_CARD_DK' => array( 155.906, 255.118), // = ( 55 x 90 ) mm = ( 2.17 x 3.54 ) in - 'BUSINESS_CARD_SE' => array( 155.906, 255.118), // = ( 55 x 90 ) mm = ( 2.17 x 3.54 ) in - 'BUSINESS_CARD_RU' => array( 141.732, 255.118), // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in - 'BUSINESS_CARD_CZ' => array( 141.732, 255.118), // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in - 'BUSINESS_CARD_FI' => array( 141.732, 255.118), // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in - 'BUSINESS_CARD_HU' => array( 141.732, 255.118), // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in - 'BUSINESS_CARD_IL' => array( 141.732, 255.118), // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in - // Billboards - '4SHEET' => array( 2880.000, 4320.000), // = ( 1016 x 1524 ) mm = ( 40.00 x 60.00 ) in - '6SHEET' => array( 3401.575, 5102.362), // = ( 1200 x 1800 ) mm = ( 47.24 x 70.87 ) in - '12SHEET' => array( 8640.000, 4320.000), // = ( 3048 x 1524 ) mm = (120.00 x 60.00 ) in - '16SHEET' => array( 5760.000, 8640.000), // = ( 2032 x 3048 ) mm = ( 80.00 x 120.00) in - '32SHEET' => array(11520.000, 8640.000), // = ( 4064 x 3048 ) mm = (160.00 x 120.00) in - '48SHEET' => array(17280.000, 8640.000), // = ( 6096 x 3048 ) mm = (240.00 x 120.00) in - '64SHEET' => array(23040.000, 8640.000), // = ( 8128 x 3048 ) mm = (320.00 x 120.00) in - '96SHEET' => array(34560.000, 8640.000), // = (12192 x 3048 ) mm = (480.00 x 120.00) in - // -- Old European Sizes - // - Old Imperial English Sizes - 'EN_EMPEROR' => array( 3456.000, 5184.000), // = ( 1219 x 1829 ) mm = ( 48.00 x 72.00 ) in - 'EN_ANTIQUARIAN' => array( 2232.000, 3816.000), // = ( 787 x 1346 ) mm = ( 31.00 x 53.00 ) in - 'EN_GRAND_EAGLE' => array( 2070.000, 3024.000), // = ( 730 x 1067 ) mm = ( 28.75 x 42.00 ) in - 'EN_DOUBLE_ELEPHANT' => array( 1926.000, 2880.000), // = ( 679 x 1016 ) mm = ( 26.75 x 40.00 ) in - 'EN_ATLAS' => array( 1872.000, 2448.000), // = ( 660 x 864 ) mm = ( 26.00 x 34.00 ) in - 'EN_COLOMBIER' => array( 1692.000, 2484.000), // = ( 597 x 876 ) mm = ( 23.50 x 34.50 ) in - 'EN_ELEPHANT' => array( 1656.000, 2016.000), // = ( 584 x 711 ) mm = ( 23.00 x 28.00 ) in - 'EN_DOUBLE_DEMY' => array( 1620.000, 2556.000), // = ( 572 x 902 ) mm = ( 22.50 x 35.50 ) in - 'EN_IMPERIAL' => array( 1584.000, 2160.000), // = ( 559 x 762 ) mm = ( 22.00 x 30.00 ) in - 'EN_PRINCESS' => array( 1548.000, 2016.000), // = ( 546 x 711 ) mm = ( 21.50 x 28.00 ) in - 'EN_CARTRIDGE' => array( 1512.000, 1872.000), // = ( 533 x 660 ) mm = ( 21.00 x 26.00 ) in - 'EN_DOUBLE_LARGE_POST' => array( 1512.000, 2376.000), // = ( 533 x 838 ) mm = ( 21.00 x 33.00 ) in - 'EN_ROYAL' => array( 1440.000, 1800.000), // = ( 508 x 635 ) mm = ( 20.00 x 25.00 ) in - 'EN_SHEET' => array( 1404.000, 1692.000), // = ( 495 x 597 ) mm = ( 19.50 x 23.50 ) in - 'EN_HALF_POST' => array( 1404.000, 1692.000), // = ( 495 x 597 ) mm = ( 19.50 x 23.50 ) in - 'EN_SUPER_ROYAL' => array( 1368.000, 1944.000), // = ( 483 x 686 ) mm = ( 19.00 x 27.00 ) in - 'EN_DOUBLE_POST' => array( 1368.000, 2196.000), // = ( 483 x 775 ) mm = ( 19.00 x 30.50 ) in - 'EN_MEDIUM' => array( 1260.000, 1656.000), // = ( 445 x 584 ) mm = ( 17.50 x 23.00 ) in - 'EN_DEMY' => array( 1260.000, 1620.000), // = ( 445 x 572 ) mm = ( 17.50 x 22.50 ) in - 'EN_LARGE_POST' => array( 1188.000, 1512.000), // = ( 419 x 533 ) mm = ( 16.50 x 21.00 ) in - 'EN_COPY_DRAUGHT' => array( 1152.000, 1440.000), // = ( 406 x 508 ) mm = ( 16.00 x 20.00 ) in - 'EN_POST' => array( 1116.000, 1386.000), // = ( 394 x 489 ) mm = ( 15.50 x 19.25 ) in - 'EN_CROWN' => array( 1080.000, 1440.000), // = ( 381 x 508 ) mm = ( 15.00 x 20.00 ) in - 'EN_PINCHED_POST' => array( 1062.000, 1332.000), // = ( 375 x 470 ) mm = ( 14.75 x 18.50 ) in - 'EN_BRIEF' => array( 972.000, 1152.000), // = ( 343 x 406 ) mm = ( 13.50 x 16.00 ) in - 'EN_FOOLSCAP' => array( 972.000, 1224.000), // = ( 343 x 432 ) mm = ( 13.50 x 17.00 ) in - 'EN_SMALL_FOOLSCAP' => array( 954.000, 1188.000), // = ( 337 x 419 ) mm = ( 13.25 x 16.50 ) in - 'EN_POTT' => array( 900.000, 1080.000), // = ( 318 x 381 ) mm = ( 12.50 x 15.00 ) in - // - Old Imperial Belgian Sizes - 'BE_GRAND_AIGLE' => array( 1984.252, 2948.031), // = ( 700 x 1040 ) mm = ( 27.56 x 40.94 ) in - 'BE_COLOMBIER' => array( 1757.480, 2409.449), // = ( 620 x 850 ) mm = ( 24.41 x 33.46 ) in - 'BE_DOUBLE_CARRE' => array( 1757.480, 2607.874), // = ( 620 x 920 ) mm = ( 24.41 x 36.22 ) in - 'BE_ELEPHANT' => array( 1746.142, 2182.677), // = ( 616 x 770 ) mm = ( 24.25 x 30.31 ) in - 'BE_PETIT_AIGLE' => array( 1700.787, 2381.102), // = ( 600 x 840 ) mm = ( 23.62 x 33.07 ) in - 'BE_GRAND_JESUS' => array( 1559.055, 2069.291), // = ( 550 x 730 ) mm = ( 21.65 x 28.74 ) in - 'BE_JESUS' => array( 1530.709, 2069.291), // = ( 540 x 730 ) mm = ( 21.26 x 28.74 ) in - 'BE_RAISIN' => array( 1417.323, 1842.520), // = ( 500 x 650 ) mm = ( 19.69 x 25.59 ) in - 'BE_GRAND_MEDIAN' => array( 1303.937, 1714.961), // = ( 460 x 605 ) mm = ( 18.11 x 23.82 ) in - 'BE_DOUBLE_POSTE' => array( 1233.071, 1601.575), // = ( 435 x 565 ) mm = ( 17.13 x 22.24 ) in - 'BE_COQUILLE' => array( 1218.898, 1587.402), // = ( 430 x 560 ) mm = ( 16.93 x 22.05 ) in - 'BE_PETIT_MEDIAN' => array( 1176.378, 1502.362), // = ( 415 x 530 ) mm = ( 16.34 x 20.87 ) in - 'BE_RUCHE' => array( 1020.472, 1303.937), // = ( 360 x 460 ) mm = ( 14.17 x 18.11 ) in - 'BE_PROPATRIA' => array( 977.953, 1218.898), // = ( 345 x 430 ) mm = ( 13.58 x 16.93 ) in - 'BE_LYS' => array( 898.583, 1125.354), // = ( 317 x 397 ) mm = ( 12.48 x 15.63 ) in - 'BE_POT' => array( 870.236, 1088.504), // = ( 307 x 384 ) mm = ( 12.09 x 15.12 ) in - 'BE_ROSETTE' => array( 765.354, 983.622), // = ( 270 x 347 ) mm = ( 10.63 x 13.66 ) in - // - Old Imperial French Sizes - 'FR_UNIVERS' => array( 2834.646, 3685.039), // = ( 1000 x 1300 ) mm = ( 39.37 x 51.18 ) in - 'FR_DOUBLE_COLOMBIER' => array( 2551.181, 3571.654), // = ( 900 x 1260 ) mm = ( 35.43 x 49.61 ) in - 'FR_GRANDE_MONDE' => array( 2551.181, 3571.654), // = ( 900 x 1260 ) mm = ( 35.43 x 49.61 ) in - 'FR_DOUBLE_SOLEIL' => array( 2267.717, 3401.575), // = ( 800 x 1200 ) mm = ( 31.50 x 47.24 ) in - 'FR_DOUBLE_JESUS' => array( 2154.331, 3174.803), // = ( 760 x 1120 ) mm = ( 29.92 x 44.09 ) in - 'FR_GRAND_AIGLE' => array( 2125.984, 3004.724), // = ( 750 x 1060 ) mm = ( 29.53 x 41.73 ) in - 'FR_PETIT_AIGLE' => array( 1984.252, 2664.567), // = ( 700 x 940 ) mm = ( 27.56 x 37.01 ) in - 'FR_DOUBLE_RAISIN' => array( 1842.520, 2834.646), // = ( 650 x 1000 ) mm = ( 25.59 x 39.37 ) in - 'FR_JOURNAL' => array( 1842.520, 2664.567), // = ( 650 x 940 ) mm = ( 25.59 x 37.01 ) in - 'FR_COLOMBIER_AFFICHE' => array( 1785.827, 2551.181), // = ( 630 x 900 ) mm = ( 24.80 x 35.43 ) in - 'FR_DOUBLE_CAVALIER' => array( 1757.480, 2607.874), // = ( 620 x 920 ) mm = ( 24.41 x 36.22 ) in - 'FR_CLOCHE' => array( 1700.787, 2267.717), // = ( 600 x 800 ) mm = ( 23.62 x 31.50 ) in - 'FR_SOLEIL' => array( 1700.787, 2267.717), // = ( 600 x 800 ) mm = ( 23.62 x 31.50 ) in - 'FR_DOUBLE_CARRE' => array( 1587.402, 2551.181), // = ( 560 x 900 ) mm = ( 22.05 x 35.43 ) in - 'FR_DOUBLE_COQUILLE' => array( 1587.402, 2494.488), // = ( 560 x 880 ) mm = ( 22.05 x 34.65 ) in - 'FR_JESUS' => array( 1587.402, 2154.331), // = ( 560 x 760 ) mm = ( 22.05 x 29.92 ) in - 'FR_RAISIN' => array( 1417.323, 1842.520), // = ( 500 x 650 ) mm = ( 19.69 x 25.59 ) in - 'FR_CAVALIER' => array( 1303.937, 1757.480), // = ( 460 x 620 ) mm = ( 18.11 x 24.41 ) in - 'FR_DOUBLE_COURONNE' => array( 1303.937, 2040.945), // = ( 460 x 720 ) mm = ( 18.11 x 28.35 ) in - 'FR_CARRE' => array( 1275.591, 1587.402), // = ( 450 x 560 ) mm = ( 17.72 x 22.05 ) in - 'FR_COQUILLE' => array( 1247.244, 1587.402), // = ( 440 x 560 ) mm = ( 17.32 x 22.05 ) in - 'FR_DOUBLE_TELLIERE' => array( 1247.244, 1927.559), // = ( 440 x 680 ) mm = ( 17.32 x 26.77 ) in - 'FR_DOUBLE_CLOCHE' => array( 1133.858, 1700.787), // = ( 400 x 600 ) mm = ( 15.75 x 23.62 ) in - 'FR_DOUBLE_POT' => array( 1133.858, 1757.480), // = ( 400 x 620 ) mm = ( 15.75 x 24.41 ) in - 'FR_ECU' => array( 1133.858, 1474.016), // = ( 400 x 520 ) mm = ( 15.75 x 20.47 ) in - 'FR_COURONNE' => array( 1020.472, 1303.937), // = ( 360 x 460 ) mm = ( 14.17 x 18.11 ) in - 'FR_TELLIERE' => array( 963.780, 1247.244), // = ( 340 x 440 ) mm = ( 13.39 x 17.32 ) in - 'FR_POT' => array( 878.740, 1133.858), // = ( 310 x 400 ) mm = ( 12.20 x 15.75 ) in - ); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -517,158 +161,6 @@ class TCPDF_STATIC { return 0; } - /** - * Get page dimensions from format name. - * @param $format (mixed) The format name @see self::$page_format
    - * @return array containing page width and height in points - * @since 5.0.010 (2010-05-17) - * @public static - */ - public static function getPageSizeFromFormat($format) { - if (isset(self::$page_formats[$format])) { - return self::$page_formats[$format]; - } - return self::$page_formats['A4']; - } - - /** - * Set page boundaries. - * @param $page (int) page number - * @param $type (string) valid values are:
    • 'MediaBox' : the boundaries of the physical medium on which the page shall be displayed or printed;
    • 'CropBox' : the visible region of default user space;
    • 'BleedBox' : the region to which the contents of the page shall be clipped when output in a production environment;
    • 'TrimBox' : the intended dimensions of the finished page after trimming;
    • 'ArtBox' : the page's meaningful content (including potential white space).
    - * @param $llx (float) lower-left x coordinate in user units. - * @param $lly (float) lower-left y coordinate in user units. - * @param $urx (float) upper-right x coordinate in user units. - * @param $ury (float) upper-right y coordinate in user units. - * @param $points (boolean) If true uses user units as unit of measure, otherwise uses PDF points. - * @param $k (float) Scale factor (number of points in user unit). - * @param $pagedim (array) Array of page dimensions. - * @return pagedim array of page dimensions. - * @since 5.0.010 (2010-05-17) - * @public static - */ - public static function setPageBoxes($page, $type, $llx, $lly, $urx, $ury, $points=false, $k, $pagedim=array()) { - if (!isset($pagedim[$page])) { - // initialize array - $pagedim[$page] = array(); - } - if (!in_array($type, self::$pageboxes)) { - return; - } - if ($points) { - $k = 1; - } - $pagedim[$page][$type]['llx'] = ($llx * $k); - $pagedim[$page][$type]['lly'] = ($lly * $k); - $pagedim[$page][$type]['urx'] = ($urx * $k); - $pagedim[$page][$type]['ury'] = ($ury * $k); - return $pagedim; - } - - /** - * Swap X and Y coordinates of page boxes (change page boxes orientation). - * @param $page (int) page number - * @param $pagedim (array) Array of page dimensions. - * @return pagedim array of page dimensions. - * @since 5.0.010 (2010-05-17) - * @public static - */ - public static function swapPageBoxCoordinates($page, $pagedim) { - foreach (self::$pageboxes as $type) { - // swap X and Y coordinates - if (isset($pagedim[$page][$type])) { - $tmp = $pagedim[$page][$type]['llx']; - $pagedim[$page][$type]['llx'] = $pagedim[$page][$type]['lly']; - $pagedim[$page][$type]['lly'] = $tmp; - $tmp = $pagedim[$page][$type]['urx']; - $pagedim[$page][$type]['urx'] = $pagedim[$page][$type]['ury']; - $pagedim[$page][$type]['ury'] = $tmp; - } - } - return $pagedim; - } - - /** - * Get the canonical page layout mode. - * @param $layout (string) The page layout. Possible values are:
    • SinglePage Display one page at a time
    • OneColumn Display the pages in one column
    • TwoColumnLeft Display the pages in two columns, with odd-numbered pages on the left
    • TwoColumnRight Display the pages in two columns, with odd-numbered pages on the right
    • TwoPageLeft (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the left
    • TwoPageRight (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the right
    - * @return (string) Canonical page layout name. - * @public static - */ - public static function getPageLayoutMode($layout='SinglePage') { - switch ($layout) { - case 'default': - case 'single': - case 'SinglePage': { - $layout_mode = 'SinglePage'; - break; - } - case 'continuous': - case 'OneColumn': { - $layout_mode = 'OneColumn'; - break; - } - case 'two': - case 'TwoColumnLeft': { - $layout_mode = 'TwoColumnLeft'; - break; - } - case 'TwoColumnRight': { - $layout_mode = 'TwoColumnRight'; - break; - } - case 'TwoPageLeft': { - $layout_mode = 'TwoPageLeft'; - break; - } - case 'TwoPageRight': { - $layout_mode = 'TwoPageRight'; - break; - } - default: { - $layout_mode = 'SinglePage'; - } - } - return $layout_mode; - } - - /** - * Get the canonical page layout mode. - * @param $mode (string) A name object specifying how the document should be displayed when opened:
    • UseNone Neither document outline nor thumbnail images visible
    • UseOutlines Document outline visible
    • UseThumbs Thumbnail images visible
    • FullScreen Full-screen mode, with no menu bar, window controls, or any other window visible
    • UseOC (PDF 1.5) Optional content group panel visible
    • UseAttachments (PDF 1.6) Attachments panel visible
    - * @return (string) Canonical page mode name. - * @public static - */ - public static function getPageMode($mode='UseNone') { - switch ($mode) { - case 'UseNone': { - $page_mode = 'UseNone'; - break; - } - case 'UseOutlines': { - $page_mode = 'UseOutlines'; - break; - } - case 'UseThumbs': { - $page_mode = 'UseThumbs'; - break; - } - case 'FullScreen': { - $page_mode = 'FullScreen'; - break; - } - case 'UseOC': { - $page_mode = 'UseOC'; - break; - } - case '': { - $page_mode = 'UseAttachments'; - break; - } - default: { - $page_mode = 'UseNone'; - } - } - return $page_mode; - } - /** * Check if the URL exist. * @param $url (string) URL to check. @@ -904,143 +396,6 @@ class TCPDF_STATIC { return substr_replace(date('YmdHisO', intval($time)), '\'', (0 - 2), 0).'\''; } - /** - * Get ULONG from string (Big Endian 32-bit unsigned integer). - * @param $str (string) string from where to extract value - * @param $offset (int) point from where to read the data - * @return int 32 bit value - * @author Nicola Asuni - * @since 5.2.000 (2010-06-02) - * @public static - */ - public static function _getULONG($str, $offset) { - $v = unpack('Ni', substr($str, $offset, 4)); - return $v['i']; - } - - /** - * Get USHORT from string (Big Endian 16-bit unsigned integer). - * @param $str (string) string from where to extract value - * @param $offset (int) point from where to read the data - * @return int 16 bit value - * @author Nicola Asuni - * @since 5.2.000 (2010-06-02) - * @public static - */ - public static function _getUSHORT($str, $offset) { - $v = unpack('ni', substr($str, $offset, 2)); - return $v['i']; - } - - /** - * Get SHORT from string (Big Endian 16-bit signed integer). - * @param $str (string) String from where to extract value. - * @param $offset (int) Point from where to read the data. - * @return int 16 bit value - * @author Nicola Asuni - * @since 5.2.000 (2010-06-02) - * @public static - */ - public static function _getSHORT($str, $offset) { - $v = unpack('si', substr($str, $offset, 2)); - return $v['i']; - } - - /** - * Get FWORD from string (Big Endian 16-bit signed integer). - * @param $str (string) String from where to extract value. - * @param $offset (int) Point from where to read the data. - * @return int 16 bit value - * @author Nicola Asuni - * @since 5.9.123 (2011-09-30) - * @public static - */ - public static function _getFWORD($str, $offset) { - $v = self::_getUSHORT($str, $offset); - if ($v > 0x7fff) { - $v -= 0x10000; - } - return $v; - } - - /** - * Get UFWORD from string (Big Endian 16-bit unsigned integer). - * @param $str (string) string from where to extract value - * @param $offset (int) point from where to read the data - * @return int 16 bit value - * @author Nicola Asuni - * @since 5.9.123 (2011-09-30) - * @public static - */ - public static function _getUFWORD($str, $offset) { - $v = self::_getUSHORT($str, $offset); - return $v; - } - - /** - * Get FIXED from string (32-bit signed fixed-point number (16.16). - * @param $str (string) string from where to extract value - * @param $offset (int) point from where to read the data - * @return int 16 bit value - * @author Nicola Asuni - * @since 5.9.123 (2011-09-30) - * @public static - */ - public static function _getFIXED($str, $offset) { - // mantissa - $m = self::_getFWORD($str, $offset); - // fraction - $f = self::_getUSHORT($str, ($offset + 2)); - $v = floatval(''.$m.'.'.$f.''); - return $v; - } - - /** - * Get BYTE from string (8-bit unsigned integer). - * @param $str (string) String from where to extract value. - * @param $offset (int) Point from where to read the data. - * @return int 8 bit value - * @author Nicola Asuni - * @since 5.2.000 (2010-06-02) - * @public static - */ - public static function _getBYTE($str, $offset) { - $v = unpack('Ci', substr($str, $offset, 1)); - return $v['i']; - } - /** - * Binary-safe and URL-safe file read. - * Reads up to length bytes from the file pointer referenced by handle. Reading stops as soon as one of the following conditions is met: length bytes have been read; EOF (end of file) is reached. - * @param $handle (resource) - * @param $length (int) - * @return Returns the read string or FALSE in case of error. - * @author Nicola Asuni - * @since 4.5.027 (2009-03-16) - * @public static - */ - public static function rfread($handle, $length) { - $data = fread($handle, $length); - if ($data === false) { - return false; - } - $rest = ($length - strlen($data)); - if ($rest > 0) { - $data .= self::rfread($handle, $rest); - } - return $data; - } - - /** - * Read a 4-byte (32 bit) integer from file. - * @param $f (string) file name. - * @return 4-byte integer - * @public static - */ - public static function _freadint($f) { - $a = unpack('Ni', fread($f, 4)); - return $a['i']; - } - /** * Returns a string containing random data to be used as a seed for encryption methods. * @param $seed (string) starting seed value @@ -1078,7 +433,7 @@ class TCPDF_STATIC { /** * Returns the input text exrypted using AES algorithm and the specified key. - * This method requires mcrypt. + * This method requires openssl or mcrypt. Text is padded to 16bytes blocks * @param $key (string) encryption key * @param $text (String) input text to be encrypted * @return String encrypted text @@ -1090,12 +445,38 @@ class TCPDF_STATIC { // padding (RFC 2898, PKCS #5: Password-Based Cryptography Specification Version 2.0) $padding = 16 - (strlen($text) % 16); $text .= str_repeat(chr($padding), $padding); + if (extension_loaded('openssl')) { + $iv = openssl_random_pseudo_bytes (openssl_cipher_iv_length('aes-256-cbc')); + $text = openssl_encrypt($text, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv); + return $iv.substr($text, 0, -16); + } $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND); $text = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv); $text = $iv.$text; return $text; } + /** + * Returns the input text exrypted using AES algorithm and the specified key. + * This method requires openssl or mcrypt. Text is not padded + * @param $key (string) encryption key + * @param $text (String) input text to be encrypted + * @return String encrypted text + * @author Nicola Asuni + * @since TODO + * @public static + */ + public static function _AESnopad($key, $text) { + if (extension_loaded('openssl')) { + $iv = str_repeat("\x00", openssl_cipher_iv_length('aes-256-cbc')); + $text = openssl_encrypt($text, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv); + return substr($text, 0, -16); + } + $iv = str_repeat("\x00", mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)); + $text = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv); + return $text; + } + /** * Returns the input text encrypted using RC4 algorithm and the specified key. * RC4 is the standard encryption algorithm used in PDF format @@ -2393,6 +1774,39 @@ class TCPDF_STATIC { return $angle; } + + + + + + + + + + + + + + + + +// ==================================================================================================================== +// REIMPLEMENTED +// ==================================================================================================================== + + + + + + + + + + + + + + /** * Split string by a regular expression. * This is a wrapper for the preg_split function to avoid the bug: https://bugs.php.net/bug.php?id=45850 @@ -2434,7 +1848,7 @@ class TCPDF_STATIC { public static function fopenLocal($filename, $mode) { if (strpos($filename, '://') === false) { $filename = 'file://'.$filename; - } elseif (strpos($filename, 'file://') !== 0) { + } elseif (stream_is_local($filename) !== true) { return false; } return fopen($filename, $mode); @@ -2450,77 +1864,741 @@ class TCPDF_STATIC { * @public static */ public static function fileGetContents($file) { - //$file = html_entity_decode($file); - // array of possible alternative paths/URLs $alt = array($file); - // replace URL relative path with full real server path + // if ((strlen($file) > 1) - AND ($file[0] == '/') - AND ($file[1] != '/') - AND !empty($_SERVER['DOCUMENT_ROOT']) - AND ($_SERVER['DOCUMENT_ROOT'] != '/')) { - $findroot = strpos($file, $_SERVER['DOCUMENT_ROOT']); - if (($findroot === false) OR ($findroot > 1)) { - if (substr($_SERVER['DOCUMENT_ROOT'], -1) == '/') { - $tmp = substr($_SERVER['DOCUMENT_ROOT'], 0, -1).$file; - } else { - $tmp = $_SERVER['DOCUMENT_ROOT'].$file; - } - $alt[] = htmlspecialchars_decode(urldecode($tmp)); - } + && ($file[0] === '/') + && ($file[1] !== '/') + && !empty($_SERVER['DOCUMENT_ROOT']) + && ($_SERVER['DOCUMENT_ROOT'] !== '/') + ) { + $findroot = strpos($file, $_SERVER['DOCUMENT_ROOT']); + if (($findroot === false) || ($findroot > 1)) { + $alt[] = htmlspecialchars_decode(urldecode($_SERVER['DOCUMENT_ROOT'].$file)); + } } - // URL mode + // + $protocol = 'http'; + if (!empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off')) { + $protocol .= 's'; + } + // $url = $file; - // check for missing protocol - if (preg_match('%^/{2}%', $url)) { - if (preg_match('%^([^:]+:)//%i', K_PATH_URL, $match)) { - $url = $match[1].str_replace(' ', '%20', $url); - $alt[] = $url; - } + if (preg_match('%^//%', $url) && !empty($_SERVER['HTTP_HOST'])) { + $url = $protocol.':'.str_replace(' ', '%20', $url); } - $urldata = @parse_url($url); - if (!isset($urldata['query']) OR (strlen($urldata['query']) <= 0)) { - if (K_PATH_URL AND (strpos($url, K_PATH_URL) === 0)) { - // convert URL to full server path - $tmp = str_replace(K_PATH_URL, K_PATH_MAIN, $url); - $tmp = htmlspecialchars_decode(urldecode($tmp)); - $alt[] = $tmp; - } - } - if (isset($_SERVER['SCRIPT_URI'])) { - $urldata = @parse_url($_SERVER['SCRIPT_URI']); - $alt[] = $urldata['scheme'].'://'.$urldata['host'].(($file[0] == '/') ? '' : '/').$file; - } - foreach ($alt as $f) { - $ret = @file_get_contents($f); - if (($ret === FALSE) - AND !ini_get('allow_url_fopen') - AND function_exists('curl_init') - AND preg_match('%^(https?|ftp)://%', $f)) { - // try to get remote file data using cURL - $cs = curl_init(); // curl session - curl_setopt($cs, CURLOPT_URL, $f); - curl_setopt($cs, CURLOPT_BINARYTRANSFER, true); - curl_setopt($cs, CURLOPT_FAILONERROR, true); - curl_setopt($cs, CURLOPT_RETURNTRANSFER, true); - if ((ini_get('open_basedir') == '') AND (!ini_get('safe_mode'))) { - curl_setopt($cs, CURLOPT_FOLLOWLOCATION, true); + $url = htmlspecialchars_decode($url); + $alt[] = $url; + // + if (preg_match('%^(https?)://%', $url) + && empty($_SERVER['HTTP_HOST']) + && empty($_SERVER['DOCUMENT_ROOT']) + ) { + $urldata = parse_url($url); + if (empty($urldata['query'])) { + $host = $protocol.'://'.$_SERVER['HTTP_HOST']; + if (strpos($url, $host) === 0) { + // convert URL to full server path + $tmp = str_replace($host, $_SERVER['DOCUMENT_ROOT'], $url); + $alt[] = htmlspecialchars_decode(urldecode($tmp)); } - curl_setopt($cs, CURLOPT_CONNECTTIMEOUT, 5); - curl_setopt($cs, CURLOPT_TIMEOUT, 30); - curl_setopt($cs, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($cs, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($cs, CURLOPT_USERAGENT, 'TCPDF'); - $ret = curl_exec($cs); - curl_close($cs); } - if ($ret !== FALSE) { + } + // + if (isset($_SERVER['SCRIPT_URI']) + && !preg_match('%^(https?|ftp)://%', $file) + && !preg_match('%^//%', $file) + ) { + $urldata = @parse_url($_SERVER['SCRIPT_URI']); + return $urldata['scheme'].'://'.$urldata['host'].(($file[0] == '/') ? '' : '/').$file; + } + // + $alt = array_unique($alt); + //var_dump($alt);exit;//DEBUG + foreach ($alt as $path) { + $ret = @file_get_contents($path); + if ($ret !== false) { + return $ret; + } + // try to use CURL for URLs + if (!ini_get('allow_url_fopen') + && function_exists('curl_init') + && preg_match('%^(https?|ftp)://%', $path) + ) { + // try to get remote file data using cURL + $crs = curl_init(); + curl_setopt($crs, CURLOPT_URL, $path); + curl_setopt($crs, CURLOPT_BINARYTRANSFER, true); + curl_setopt($crs, CURLOPT_FAILONERROR, true); + curl_setopt($crs, CURLOPT_RETURNTRANSFER, true); + if ((ini_get('open_basedir') == '') && (!ini_get('safe_mode'))) { + curl_setopt($crs, CURLOPT_FOLLOWLOCATION, true); + } + curl_setopt($crs, CURLOPT_CONNECTTIMEOUT, 5); + curl_setopt($crs, CURLOPT_TIMEOUT, 30); + curl_setopt($crs, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($crs, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($crs, CURLOPT_USERAGENT, 'tc-lib-file'); + $ret = curl_exec($crs); + curl_close($crs); + if ($ret !== false) { + return $ret; + } + } + } + return false; + } + + + + /** + * Get ULONG from string (Big Endian 32-bit unsigned integer). + * @param $str (string) string from where to extract value + * @param $offset (int) point from where to read the data + * @return int 32 bit value + * @author Nicola Asuni + * @since 5.2.000 (2010-06-02) + * @public static + */ + public static function _getULONG($str, $offset) { + $v = unpack('Ni', substr($str, $offset, 4)); + return $v['i']; + } + + /** + * Get USHORT from string (Big Endian 16-bit unsigned integer). + * @param $str (string) string from where to extract value + * @param $offset (int) point from where to read the data + * @return int 16 bit value + * @author Nicola Asuni + * @since 5.2.000 (2010-06-02) + * @public static + */ + public static function _getUSHORT($str, $offset) { + $v = unpack('ni', substr($str, $offset, 2)); + return $v['i']; + } + + /** + * Get SHORT from string (Big Endian 16-bit signed integer). + * @param $str (string) String from where to extract value. + * @param $offset (int) Point from where to read the data. + * @return int 16 bit value + * @author Nicola Asuni + * @since 5.2.000 (2010-06-02) + * @public static + */ + public static function _getSHORT($str, $offset) { + $v = unpack('si', substr($str, $offset, 2)); + return $v['i']; + } + + /** + * Get FWORD from string (Big Endian 16-bit signed integer). + * @param $str (string) String from where to extract value. + * @param $offset (int) Point from where to read the data. + * @return int 16 bit value + * @author Nicola Asuni + * @since 5.9.123 (2011-09-30) + * @public static + */ + public static function _getFWORD($str, $offset) { + $v = self::_getUSHORT($str, $offset); + if ($v > 0x7fff) { + $v -= 0x10000; + } + return $v; + } + + /** + * Get UFWORD from string (Big Endian 16-bit unsigned integer). + * @param $str (string) string from where to extract value + * @param $offset (int) point from where to read the data + * @return int 16 bit value + * @author Nicola Asuni + * @since 5.9.123 (2011-09-30) + * @public static + */ + public static function _getUFWORD($str, $offset) { + $v = self::_getUSHORT($str, $offset); + return $v; + } + + /** + * Get FIXED from string (32-bit signed fixed-point number (16.16). + * @param $str (string) string from where to extract value + * @param $offset (int) point from where to read the data + * @return int 16 bit value + * @author Nicola Asuni + * @since 5.9.123 (2011-09-30) + * @public static + */ + public static function _getFIXED($str, $offset) { + // mantissa + $m = self::_getFWORD($str, $offset); + // fraction + $f = self::_getUSHORT($str, ($offset + 2)); + $v = floatval(''.$m.'.'.$f.''); + return $v; + } + + /** + * Get BYTE from string (8-bit unsigned integer). + * @param $str (string) String from where to extract value. + * @param $offset (int) Point from where to read the data. + * @return int 8 bit value + * @author Nicola Asuni + * @since 5.2.000 (2010-06-02) + * @public static + */ + public static function _getBYTE($str, $offset) { + $v = unpack('Ci', substr($str, $offset, 1)); + return $v['i']; + } + /** + * Binary-safe and URL-safe file read. + * Reads up to length bytes from the file pointer referenced by handle. Reading stops as soon as one of the following conditions is met: length bytes have been read; EOF (end of file) is reached. + * @param $handle (resource) + * @param $length (int) + * @return Returns the read string or FALSE in case of error. + * @author Nicola Asuni + * @since 4.5.027 (2009-03-16) + * @public static + */ + public static function rfread($handle, $length) { + $data = fread($handle, $length); + if ($data === false) { + return false; + } + $rest = ($length - strlen($data)); + if (($rest > 0) && !feof($handle)) { + $data .= self::rfread($handle, $rest); + } + return $data; + } + + /** + * Read a 4-byte (32 bit) integer from file. + * @param $f (string) file name. + * @return 4-byte integer + * @public static + */ + public static function _freadint($f) { + $a = unpack('Ni', fread($f, 4)); + return $a['i']; + } + + + /** + * Array of page formats + * measures are calculated in this way: (inches * 72) or (millimeters * 72 / 25.4) + * @public static + */ + public static $page_formats = array( + // ISO 216 A Series + 2 SIS 014711 extensions + 'A0' => array( 2383.937, 3370.394), // = ( 841 x 1189 ) mm = ( 33.11 x 46.81 ) in + 'A1' => array( 1683.780, 2383.937), // = ( 594 x 841 ) mm = ( 23.39 x 33.11 ) in + 'A2' => array( 1190.551, 1683.780), // = ( 420 x 594 ) mm = ( 16.54 x 23.39 ) in + 'A3' => array( 841.890, 1190.551), // = ( 297 x 420 ) mm = ( 11.69 x 16.54 ) in + 'A4' => array( 595.276, 841.890), // = ( 210 x 297 ) mm = ( 8.27 x 11.69 ) in + 'A5' => array( 419.528, 595.276), // = ( 148 x 210 ) mm = ( 5.83 x 8.27 ) in + 'A6' => array( 297.638, 419.528), // = ( 105 x 148 ) mm = ( 4.13 x 5.83 ) in + 'A7' => array( 209.764, 297.638), // = ( 74 x 105 ) mm = ( 2.91 x 4.13 ) in + 'A8' => array( 147.402, 209.764), // = ( 52 x 74 ) mm = ( 2.05 x 2.91 ) in + 'A9' => array( 104.882, 147.402), // = ( 37 x 52 ) mm = ( 1.46 x 2.05 ) in + 'A10' => array( 73.701, 104.882), // = ( 26 x 37 ) mm = ( 1.02 x 1.46 ) in + 'A11' => array( 51.024, 73.701), // = ( 18 x 26 ) mm = ( 0.71 x 1.02 ) in + 'A12' => array( 36.850, 51.024), // = ( 13 x 18 ) mm = ( 0.51 x 0.71 ) in + // ISO 216 B Series + 2 SIS 014711 extensions + 'B0' => array( 2834.646, 4008.189), // = ( 1000 x 1414 ) mm = ( 39.37 x 55.67 ) in + 'B1' => array( 2004.094, 2834.646), // = ( 707 x 1000 ) mm = ( 27.83 x 39.37 ) in + 'B2' => array( 1417.323, 2004.094), // = ( 500 x 707 ) mm = ( 19.69 x 27.83 ) in + 'B3' => array( 1000.630, 1417.323), // = ( 353 x 500 ) mm = ( 13.90 x 19.69 ) in + 'B4' => array( 708.661, 1000.630), // = ( 250 x 353 ) mm = ( 9.84 x 13.90 ) in + 'B5' => array( 498.898, 708.661), // = ( 176 x 250 ) mm = ( 6.93 x 9.84 ) in + 'B6' => array( 354.331, 498.898), // = ( 125 x 176 ) mm = ( 4.92 x 6.93 ) in + 'B7' => array( 249.449, 354.331), // = ( 88 x 125 ) mm = ( 3.46 x 4.92 ) in + 'B8' => array( 175.748, 249.449), // = ( 62 x 88 ) mm = ( 2.44 x 3.46 ) in + 'B9' => array( 124.724, 175.748), // = ( 44 x 62 ) mm = ( 1.73 x 2.44 ) in + 'B10' => array( 87.874, 124.724), // = ( 31 x 44 ) mm = ( 1.22 x 1.73 ) in + 'B11' => array( 62.362, 87.874), // = ( 22 x 31 ) mm = ( 0.87 x 1.22 ) in + 'B12' => array( 42.520, 62.362), // = ( 15 x 22 ) mm = ( 0.59 x 0.87 ) in + // ISO 216 C Series + 2 SIS 014711 extensions + 5 EXTENSION + 'C0' => array( 2599.370, 3676.535), // = ( 917 x 1297 ) mm = ( 36.10 x 51.06 ) in + 'C1' => array( 1836.850, 2599.370), // = ( 648 x 917 ) mm = ( 25.51 x 36.10 ) in + 'C2' => array( 1298.268, 1836.850), // = ( 458 x 648 ) mm = ( 18.03 x 25.51 ) in + 'C3' => array( 918.425, 1298.268), // = ( 324 x 458 ) mm = ( 12.76 x 18.03 ) in + 'C4' => array( 649.134, 918.425), // = ( 229 x 324 ) mm = ( 9.02 x 12.76 ) in + 'C5' => array( 459.213, 649.134), // = ( 162 x 229 ) mm = ( 6.38 x 9.02 ) in + 'C6' => array( 323.150, 459.213), // = ( 114 x 162 ) mm = ( 4.49 x 6.38 ) in + 'C7' => array( 229.606, 323.150), // = ( 81 x 114 ) mm = ( 3.19 x 4.49 ) in + 'C8' => array( 161.575, 229.606), // = ( 57 x 81 ) mm = ( 2.24 x 3.19 ) in + 'C9' => array( 113.386, 161.575), // = ( 40 x 57 ) mm = ( 1.57 x 2.24 ) in + 'C10' => array( 79.370, 113.386), // = ( 28 x 40 ) mm = ( 1.10 x 1.57 ) in + 'C11' => array( 56.693, 79.370), // = ( 20 x 28 ) mm = ( 0.79 x 1.10 ) in + 'C12' => array( 39.685, 56.693), // = ( 14 x 20 ) mm = ( 0.55 x 0.79 ) in + 'C76' => array( 229.606, 459.213), // = ( 81 x 162 ) mm = ( 3.19 x 6.38 ) in + 'DL' => array( 311.811, 623.622), // = ( 110 x 220 ) mm = ( 4.33 x 8.66 ) in + 'DLE' => array( 323.150, 637.795), // = ( 114 x 225 ) mm = ( 4.49 x 8.86 ) in + 'DLX' => array( 340.158, 666.142), // = ( 120 x 235 ) mm = ( 4.72 x 9.25 ) in + 'DLP' => array( 280.630, 595.276), // = ( 99 x 210 ) mm = ( 3.90 x 8.27 ) in (1/3 A4) + // SIS 014711 E Series + 'E0' => array( 2491.654, 3517.795), // = ( 879 x 1241 ) mm = ( 34.61 x 48.86 ) in + 'E1' => array( 1757.480, 2491.654), // = ( 620 x 879 ) mm = ( 24.41 x 34.61 ) in + 'E2' => array( 1247.244, 1757.480), // = ( 440 x 620 ) mm = ( 17.32 x 24.41 ) in + 'E3' => array( 878.740, 1247.244), // = ( 310 x 440 ) mm = ( 12.20 x 17.32 ) in + 'E4' => array( 623.622, 878.740), // = ( 220 x 310 ) mm = ( 8.66 x 12.20 ) in + 'E5' => array( 439.370, 623.622), // = ( 155 x 220 ) mm = ( 6.10 x 8.66 ) in + 'E6' => array( 311.811, 439.370), // = ( 110 x 155 ) mm = ( 4.33 x 6.10 ) in + 'E7' => array( 221.102, 311.811), // = ( 78 x 110 ) mm = ( 3.07 x 4.33 ) in + 'E8' => array( 155.906, 221.102), // = ( 55 x 78 ) mm = ( 2.17 x 3.07 ) in + 'E9' => array( 110.551, 155.906), // = ( 39 x 55 ) mm = ( 1.54 x 2.17 ) in + 'E10' => array( 76.535, 110.551), // = ( 27 x 39 ) mm = ( 1.06 x 1.54 ) in + 'E11' => array( 53.858, 76.535), // = ( 19 x 27 ) mm = ( 0.75 x 1.06 ) in + 'E12' => array( 36.850, 53.858), // = ( 13 x 19 ) mm = ( 0.51 x 0.75 ) in + // SIS 014711 G Series + 'G0' => array( 2715.591, 3838.110), // = ( 958 x 1354 ) mm = ( 37.72 x 53.31 ) in + 'G1' => array( 1919.055, 2715.591), // = ( 677 x 958 ) mm = ( 26.65 x 37.72 ) in + 'G2' => array( 1357.795, 1919.055), // = ( 479 x 677 ) mm = ( 18.86 x 26.65 ) in + 'G3' => array( 958.110, 1357.795), // = ( 338 x 479 ) mm = ( 13.31 x 18.86 ) in + 'G4' => array( 677.480, 958.110), // = ( 239 x 338 ) mm = ( 9.41 x 13.31 ) in + 'G5' => array( 479.055, 677.480), // = ( 169 x 239 ) mm = ( 6.65 x 9.41 ) in + 'G6' => array( 337.323, 479.055), // = ( 119 x 169 ) mm = ( 4.69 x 6.65 ) in + 'G7' => array( 238.110, 337.323), // = ( 84 x 119 ) mm = ( 3.31 x 4.69 ) in + 'G8' => array( 167.244, 238.110), // = ( 59 x 84 ) mm = ( 2.32 x 3.31 ) in + 'G9' => array( 119.055, 167.244), // = ( 42 x 59 ) mm = ( 1.65 x 2.32 ) in + 'G10' => array( 82.205, 119.055), // = ( 29 x 42 ) mm = ( 1.14 x 1.65 ) in + 'G11' => array( 59.528, 82.205), // = ( 21 x 29 ) mm = ( 0.83 x 1.14 ) in + 'G12' => array( 39.685, 59.528), // = ( 14 x 21 ) mm = ( 0.55 x 0.83 ) in + // ISO Press + 'RA0' => array( 2437.795, 3458.268), // = ( 860 x 1220 ) mm = ( 33.86 x 48.03 ) in + 'RA1' => array( 1729.134, 2437.795), // = ( 610 x 860 ) mm = ( 24.02 x 33.86 ) in + 'RA2' => array( 1218.898, 1729.134), // = ( 430 x 610 ) mm = ( 16.93 x 24.02 ) in + 'RA3' => array( 864.567, 1218.898), // = ( 305 x 430 ) mm = ( 12.01 x 16.93 ) in + 'RA4' => array( 609.449, 864.567), // = ( 215 x 305 ) mm = ( 8.46 x 12.01 ) in + 'SRA0' => array( 2551.181, 3628.346), // = ( 900 x 1280 ) mm = ( 35.43 x 50.39 ) in + 'SRA1' => array( 1814.173, 2551.181), // = ( 640 x 900 ) mm = ( 25.20 x 35.43 ) in + 'SRA2' => array( 1275.591, 1814.173), // = ( 450 x 640 ) mm = ( 17.72 x 25.20 ) in + 'SRA3' => array( 907.087, 1275.591), // = ( 320 x 450 ) mm = ( 12.60 x 17.72 ) in + 'SRA4' => array( 637.795, 907.087), // = ( 225 x 320 ) mm = ( 8.86 x 12.60 ) in + // German DIN 476 + '4A0' => array( 4767.874, 6740.787), // = ( 1682 x 2378 ) mm = ( 66.22 x 93.62 ) in + '2A0' => array( 3370.394, 4767.874), // = ( 1189 x 1682 ) mm = ( 46.81 x 66.22 ) in + // Variations on the ISO Standard + 'A2_EXTRA' => array( 1261.417, 1754.646), // = ( 445 x 619 ) mm = ( 17.52 x 24.37 ) in + 'A3+' => array( 932.598, 1369.134), // = ( 329 x 483 ) mm = ( 12.95 x 19.02 ) in + 'A3_EXTRA' => array( 912.756, 1261.417), // = ( 322 x 445 ) mm = ( 12.68 x 17.52 ) in + 'A3_SUPER' => array( 864.567, 1440.000), // = ( 305 x 508 ) mm = ( 12.01 x 20.00 ) in + 'SUPER_A3' => array( 864.567, 1380.472), // = ( 305 x 487 ) mm = ( 12.01 x 19.17 ) in + 'A4_EXTRA' => array( 666.142, 912.756), // = ( 235 x 322 ) mm = ( 9.25 x 12.68 ) in + 'A4_SUPER' => array( 649.134, 912.756), // = ( 229 x 322 ) mm = ( 9.02 x 12.68 ) in + 'SUPER_A4' => array( 643.465, 1009.134), // = ( 227 x 356 ) mm = ( 8.94 x 14.02 ) in + 'A4_LONG' => array( 595.276, 986.457), // = ( 210 x 348 ) mm = ( 8.27 x 13.70 ) in + 'F4' => array( 595.276, 935.433), // = ( 210 x 330 ) mm = ( 8.27 x 12.99 ) in + 'SO_B5_EXTRA' => array( 572.598, 782.362), // = ( 202 x 276 ) mm = ( 7.95 x 10.87 ) in + 'A5_EXTRA' => array( 490.394, 666.142), // = ( 173 x 235 ) mm = ( 6.81 x 9.25 ) in + // ANSI Series + 'ANSI_E' => array( 2448.000, 3168.000), // = ( 864 x 1118 ) mm = ( 34.00 x 44.00 ) in + 'ANSI_D' => array( 1584.000, 2448.000), // = ( 559 x 864 ) mm = ( 22.00 x 34.00 ) in + 'ANSI_C' => array( 1224.000, 1584.000), // = ( 432 x 559 ) mm = ( 17.00 x 22.00 ) in + 'ANSI_B' => array( 792.000, 1224.000), // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in + 'ANSI_A' => array( 612.000, 792.000), // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in + // Traditional 'Loose' North American Paper Sizes + 'USLEDGER' => array( 1224.000, 792.000), // = ( 432 x 279 ) mm = ( 17.00 x 11.00 ) in + 'LEDGER' => array( 1224.000, 792.000), // = ( 432 x 279 ) mm = ( 17.00 x 11.00 ) in + 'ORGANIZERK' => array( 792.000, 1224.000), // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in + 'BIBLE' => array( 792.000, 1224.000), // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in + 'USTABLOID' => array( 792.000, 1224.000), // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in + 'TABLOID' => array( 792.000, 1224.000), // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in + 'ORGANIZERM' => array( 612.000, 792.000), // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in + 'USLETTER' => array( 612.000, 792.000), // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in + 'LETTER' => array( 612.000, 792.000), // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in + 'USLEGAL' => array( 612.000, 1008.000), // = ( 216 x 356 ) mm = ( 8.50 x 14.00 ) in + 'LEGAL' => array( 612.000, 1008.000), // = ( 216 x 356 ) mm = ( 8.50 x 14.00 ) in + 'GOVERNMENTLETTER' => array( 576.000, 756.000), // = ( 203 x 267 ) mm = ( 8.00 x 10.50 ) in + 'GLETTER' => array( 576.000, 756.000), // = ( 203 x 267 ) mm = ( 8.00 x 10.50 ) in + 'JUNIORLEGAL' => array( 576.000, 360.000), // = ( 203 x 127 ) mm = ( 8.00 x 5.00 ) in + 'JLEGAL' => array( 576.000, 360.000), // = ( 203 x 127 ) mm = ( 8.00 x 5.00 ) in + // Other North American Paper Sizes + 'QUADDEMY' => array( 2520.000, 3240.000), // = ( 889 x 1143 ) mm = ( 35.00 x 45.00 ) in + 'SUPER_B' => array( 936.000, 1368.000), // = ( 330 x 483 ) mm = ( 13.00 x 19.00 ) in + 'QUARTO' => array( 648.000, 792.000), // = ( 229 x 279 ) mm = ( 9.00 x 11.00 ) in + 'GOVERNMENTLEGAL' => array( 612.000, 936.000), // = ( 216 x 330 ) mm = ( 8.50 x 13.00 ) in + 'FOLIO' => array( 612.000, 936.000), // = ( 216 x 330 ) mm = ( 8.50 x 13.00 ) in + 'MONARCH' => array( 522.000, 756.000), // = ( 184 x 267 ) mm = ( 7.25 x 10.50 ) in + 'EXECUTIVE' => array( 522.000, 756.000), // = ( 184 x 267 ) mm = ( 7.25 x 10.50 ) in + 'ORGANIZERL' => array( 396.000, 612.000), // = ( 140 x 216 ) mm = ( 5.50 x 8.50 ) in + 'STATEMENT' => array( 396.000, 612.000), // = ( 140 x 216 ) mm = ( 5.50 x 8.50 ) in + 'MEMO' => array( 396.000, 612.000), // = ( 140 x 216 ) mm = ( 5.50 x 8.50 ) in + 'FOOLSCAP' => array( 595.440, 936.000), // = ( 210 x 330 ) mm = ( 8.27 x 13.00 ) in + 'COMPACT' => array( 306.000, 486.000), // = ( 108 x 171 ) mm = ( 4.25 x 6.75 ) in + 'ORGANIZERJ' => array( 198.000, 360.000), // = ( 70 x 127 ) mm = ( 2.75 x 5.00 ) in + // Canadian standard CAN 2-9.60M + 'P1' => array( 1587.402, 2437.795), // = ( 560 x 860 ) mm = ( 22.05 x 33.86 ) in + 'P2' => array( 1218.898, 1587.402), // = ( 430 x 560 ) mm = ( 16.93 x 22.05 ) in + 'P3' => array( 793.701, 1218.898), // = ( 280 x 430 ) mm = ( 11.02 x 16.93 ) in + 'P4' => array( 609.449, 793.701), // = ( 215 x 280 ) mm = ( 8.46 x 11.02 ) in + 'P5' => array( 396.850, 609.449), // = ( 140 x 215 ) mm = ( 5.51 x 8.46 ) in + 'P6' => array( 303.307, 396.850), // = ( 107 x 140 ) mm = ( 4.21 x 5.51 ) in + // North American Architectural Sizes + 'ARCH_E' => array( 2592.000, 3456.000), // = ( 914 x 1219 ) mm = ( 36.00 x 48.00 ) in + 'ARCH_E1' => array( 2160.000, 3024.000), // = ( 762 x 1067 ) mm = ( 30.00 x 42.00 ) in + 'ARCH_D' => array( 1728.000, 2592.000), // = ( 610 x 914 ) mm = ( 24.00 x 36.00 ) in + 'BROADSHEET' => array( 1296.000, 1728.000), // = ( 457 x 610 ) mm = ( 18.00 x 24.00 ) in + 'ARCH_C' => array( 1296.000, 1728.000), // = ( 457 x 610 ) mm = ( 18.00 x 24.00 ) in + 'ARCH_B' => array( 864.000, 1296.000), // = ( 305 x 457 ) mm = ( 12.00 x 18.00 ) in + 'ARCH_A' => array( 648.000, 864.000), // = ( 229 x 305 ) mm = ( 9.00 x 12.00 ) in + // -- North American Envelope Sizes + // - Announcement Envelopes + 'ANNENV_A2' => array( 314.640, 414.000), // = ( 111 x 146 ) mm = ( 4.37 x 5.75 ) in + 'ANNENV_A6' => array( 342.000, 468.000), // = ( 121 x 165 ) mm = ( 4.75 x 6.50 ) in + 'ANNENV_A7' => array( 378.000, 522.000), // = ( 133 x 184 ) mm = ( 5.25 x 7.25 ) in + 'ANNENV_A8' => array( 396.000, 584.640), // = ( 140 x 206 ) mm = ( 5.50 x 8.12 ) in + 'ANNENV_A10' => array( 450.000, 692.640), // = ( 159 x 244 ) mm = ( 6.25 x 9.62 ) in + 'ANNENV_SLIM' => array( 278.640, 638.640), // = ( 98 x 225 ) mm = ( 3.87 x 8.87 ) in + // - Commercial Envelopes + 'COMMENV_N6_1/4' => array( 252.000, 432.000), // = ( 89 x 152 ) mm = ( 3.50 x 6.00 ) in + 'COMMENV_N6_3/4' => array( 260.640, 468.000), // = ( 92 x 165 ) mm = ( 3.62 x 6.50 ) in + 'COMMENV_N8' => array( 278.640, 540.000), // = ( 98 x 191 ) mm = ( 3.87 x 7.50 ) in + 'COMMENV_N9' => array( 278.640, 638.640), // = ( 98 x 225 ) mm = ( 3.87 x 8.87 ) in + 'COMMENV_N10' => array( 296.640, 684.000), // = ( 105 x 241 ) mm = ( 4.12 x 9.50 ) in + 'COMMENV_N11' => array( 324.000, 746.640), // = ( 114 x 263 ) mm = ( 4.50 x 10.37 ) in + 'COMMENV_N12' => array( 342.000, 792.000), // = ( 121 x 279 ) mm = ( 4.75 x 11.00 ) in + 'COMMENV_N14' => array( 360.000, 828.000), // = ( 127 x 292 ) mm = ( 5.00 x 11.50 ) in + // - Catalogue Envelopes + 'CATENV_N1' => array( 432.000, 648.000), // = ( 152 x 229 ) mm = ( 6.00 x 9.00 ) in + 'CATENV_N1_3/4' => array( 468.000, 684.000), // = ( 165 x 241 ) mm = ( 6.50 x 9.50 ) in + 'CATENV_N2' => array( 468.000, 720.000), // = ( 165 x 254 ) mm = ( 6.50 x 10.00 ) in + 'CATENV_N3' => array( 504.000, 720.000), // = ( 178 x 254 ) mm = ( 7.00 x 10.00 ) in + 'CATENV_N6' => array( 540.000, 756.000), // = ( 191 x 267 ) mm = ( 7.50 x 10.50 ) in + 'CATENV_N7' => array( 576.000, 792.000), // = ( 203 x 279 ) mm = ( 8.00 x 11.00 ) in + 'CATENV_N8' => array( 594.000, 810.000), // = ( 210 x 286 ) mm = ( 8.25 x 11.25 ) in + 'CATENV_N9_1/2' => array( 612.000, 756.000), // = ( 216 x 267 ) mm = ( 8.50 x 10.50 ) in + 'CATENV_N9_3/4' => array( 630.000, 810.000), // = ( 222 x 286 ) mm = ( 8.75 x 11.25 ) in + 'CATENV_N10_1/2' => array( 648.000, 864.000), // = ( 229 x 305 ) mm = ( 9.00 x 12.00 ) in + 'CATENV_N12_1/2' => array( 684.000, 900.000), // = ( 241 x 318 ) mm = ( 9.50 x 12.50 ) in + 'CATENV_N13_1/2' => array( 720.000, 936.000), // = ( 254 x 330 ) mm = ( 10.00 x 13.00 ) in + 'CATENV_N14_1/4' => array( 810.000, 882.000), // = ( 286 x 311 ) mm = ( 11.25 x 12.25 ) in + 'CATENV_N14_1/2' => array( 828.000, 1044.000), // = ( 292 x 368 ) mm = ( 11.50 x 14.50 ) in + // Japanese (JIS P 0138-61) Standard B-Series + 'JIS_B0' => array( 2919.685, 4127.244), // = ( 1030 x 1456 ) mm = ( 40.55 x 57.32 ) in + 'JIS_B1' => array( 2063.622, 2919.685), // = ( 728 x 1030 ) mm = ( 28.66 x 40.55 ) in + 'JIS_B2' => array( 1459.843, 2063.622), // = ( 515 x 728 ) mm = ( 20.28 x 28.66 ) in + 'JIS_B3' => array( 1031.811, 1459.843), // = ( 364 x 515 ) mm = ( 14.33 x 20.28 ) in + 'JIS_B4' => array( 728.504, 1031.811), // = ( 257 x 364 ) mm = ( 10.12 x 14.33 ) in + 'JIS_B5' => array( 515.906, 728.504), // = ( 182 x 257 ) mm = ( 7.17 x 10.12 ) in + 'JIS_B6' => array( 362.835, 515.906), // = ( 128 x 182 ) mm = ( 5.04 x 7.17 ) in + 'JIS_B7' => array( 257.953, 362.835), // = ( 91 x 128 ) mm = ( 3.58 x 5.04 ) in + 'JIS_B8' => array( 181.417, 257.953), // = ( 64 x 91 ) mm = ( 2.52 x 3.58 ) in + 'JIS_B9' => array( 127.559, 181.417), // = ( 45 x 64 ) mm = ( 1.77 x 2.52 ) in + 'JIS_B10' => array( 90.709, 127.559), // = ( 32 x 45 ) mm = ( 1.26 x 1.77 ) in + 'JIS_B11' => array( 62.362, 90.709), // = ( 22 x 32 ) mm = ( 0.87 x 1.26 ) in + 'JIS_B12' => array( 45.354, 62.362), // = ( 16 x 22 ) mm = ( 0.63 x 0.87 ) in + // PA Series + 'PA0' => array( 2381.102, 3174.803), // = ( 840 x 1120 ) mm = ( 33.07 x 44.09 ) in + 'PA1' => array( 1587.402, 2381.102), // = ( 560 x 840 ) mm = ( 22.05 x 33.07 ) in + 'PA2' => array( 1190.551, 1587.402), // = ( 420 x 560 ) mm = ( 16.54 x 22.05 ) in + 'PA3' => array( 793.701, 1190.551), // = ( 280 x 420 ) mm = ( 11.02 x 16.54 ) in + 'PA4' => array( 595.276, 793.701), // = ( 210 x 280 ) mm = ( 8.27 x 11.02 ) in + 'PA5' => array( 396.850, 595.276), // = ( 140 x 210 ) mm = ( 5.51 x 8.27 ) in + 'PA6' => array( 297.638, 396.850), // = ( 105 x 140 ) mm = ( 4.13 x 5.51 ) in + 'PA7' => array( 198.425, 297.638), // = ( 70 x 105 ) mm = ( 2.76 x 4.13 ) in + 'PA8' => array( 147.402, 198.425), // = ( 52 x 70 ) mm = ( 2.05 x 2.76 ) in + 'PA9' => array( 99.213, 147.402), // = ( 35 x 52 ) mm = ( 1.38 x 2.05 ) in + 'PA10' => array( 73.701, 99.213), // = ( 26 x 35 ) mm = ( 1.02 x 1.38 ) in + // Standard Photographic Print Sizes + 'PASSPORT_PHOTO' => array( 99.213, 127.559), // = ( 35 x 45 ) mm = ( 1.38 x 1.77 ) in + 'E' => array( 233.858, 340.157), // = ( 82 x 120 ) mm = ( 3.25 x 4.72 ) in + 'L' => array( 252.283, 360.000), // = ( 89 x 127 ) mm = ( 3.50 x 5.00 ) in + '3R' => array( 252.283, 360.000), // = ( 89 x 127 ) mm = ( 3.50 x 5.00 ) in + 'KG' => array( 289.134, 430.866), // = ( 102 x 152 ) mm = ( 4.02 x 5.98 ) in + '4R' => array( 289.134, 430.866), // = ( 102 x 152 ) mm = ( 4.02 x 5.98 ) in + '4D' => array( 340.157, 430.866), // = ( 120 x 152 ) mm = ( 4.72 x 5.98 ) in + '2L' => array( 360.000, 504.567), // = ( 127 x 178 ) mm = ( 5.00 x 7.01 ) in + '5R' => array( 360.000, 504.567), // = ( 127 x 178 ) mm = ( 5.00 x 7.01 ) in + '8P' => array( 430.866, 575.433), // = ( 152 x 203 ) mm = ( 5.98 x 7.99 ) in + '6R' => array( 430.866, 575.433), // = ( 152 x 203 ) mm = ( 5.98 x 7.99 ) in + '6P' => array( 575.433, 720.000), // = ( 203 x 254 ) mm = ( 7.99 x 10.00 ) in + '8R' => array( 575.433, 720.000), // = ( 203 x 254 ) mm = ( 7.99 x 10.00 ) in + '6PW' => array( 575.433, 864.567), // = ( 203 x 305 ) mm = ( 7.99 x 12.01 ) in + 'S8R' => array( 575.433, 864.567), // = ( 203 x 305 ) mm = ( 7.99 x 12.01 ) in + '4P' => array( 720.000, 864.567), // = ( 254 x 305 ) mm = ( 10.00 x 12.01 ) in + '10R' => array( 720.000, 864.567), // = ( 254 x 305 ) mm = ( 10.00 x 12.01 ) in + '4PW' => array( 720.000, 1080.000), // = ( 254 x 381 ) mm = ( 10.00 x 15.00 ) in + 'S10R' => array( 720.000, 1080.000), // = ( 254 x 381 ) mm = ( 10.00 x 15.00 ) in + '11R' => array( 790.866, 1009.134), // = ( 279 x 356 ) mm = ( 10.98 x 14.02 ) in + 'S11R' => array( 790.866, 1224.567), // = ( 279 x 432 ) mm = ( 10.98 x 17.01 ) in + '12R' => array( 864.567, 1080.000), // = ( 305 x 381 ) mm = ( 12.01 x 15.00 ) in + 'S12R' => array( 864.567, 1292.598), // = ( 305 x 456 ) mm = ( 12.01 x 17.95 ) in + // Common Newspaper Sizes + 'NEWSPAPER_BROADSHEET' => array( 2125.984, 1700.787), // = ( 750 x 600 ) mm = ( 29.53 x 23.62 ) in + 'NEWSPAPER_BERLINER' => array( 1332.283, 892.913), // = ( 470 x 315 ) mm = ( 18.50 x 12.40 ) in + 'NEWSPAPER_TABLOID' => array( 1218.898, 793.701), // = ( 430 x 280 ) mm = ( 16.93 x 11.02 ) in + 'NEWSPAPER_COMPACT' => array( 1218.898, 793.701), // = ( 430 x 280 ) mm = ( 16.93 x 11.02 ) in + // Business Cards + 'CREDIT_CARD' => array( 153.014, 242.646), // = ( 54 x 86 ) mm = ( 2.13 x 3.37 ) in + 'BUSINESS_CARD' => array( 153.014, 242.646), // = ( 54 x 86 ) mm = ( 2.13 x 3.37 ) in + 'BUSINESS_CARD_ISO7810' => array( 153.014, 242.646), // = ( 54 x 86 ) mm = ( 2.13 x 3.37 ) in + 'BUSINESS_CARD_ISO216' => array( 147.402, 209.764), // = ( 52 x 74 ) mm = ( 2.05 x 2.91 ) in + 'BUSINESS_CARD_IT' => array( 155.906, 240.945), // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in + 'BUSINESS_CARD_UK' => array( 155.906, 240.945), // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in + 'BUSINESS_CARD_FR' => array( 155.906, 240.945), // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in + 'BUSINESS_CARD_DE' => array( 155.906, 240.945), // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in + 'BUSINESS_CARD_ES' => array( 155.906, 240.945), // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in + 'BUSINESS_CARD_CA' => array( 144.567, 252.283), // = ( 51 x 89 ) mm = ( 2.01 x 3.50 ) in + 'BUSINESS_CARD_US' => array( 144.567, 252.283), // = ( 51 x 89 ) mm = ( 2.01 x 3.50 ) in + 'BUSINESS_CARD_JP' => array( 155.906, 257.953), // = ( 55 x 91 ) mm = ( 2.17 x 3.58 ) in + 'BUSINESS_CARD_HK' => array( 153.071, 255.118), // = ( 54 x 90 ) mm = ( 2.13 x 3.54 ) in + 'BUSINESS_CARD_AU' => array( 155.906, 255.118), // = ( 55 x 90 ) mm = ( 2.17 x 3.54 ) in + 'BUSINESS_CARD_DK' => array( 155.906, 255.118), // = ( 55 x 90 ) mm = ( 2.17 x 3.54 ) in + 'BUSINESS_CARD_SE' => array( 155.906, 255.118), // = ( 55 x 90 ) mm = ( 2.17 x 3.54 ) in + 'BUSINESS_CARD_RU' => array( 141.732, 255.118), // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in + 'BUSINESS_CARD_CZ' => array( 141.732, 255.118), // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in + 'BUSINESS_CARD_FI' => array( 141.732, 255.118), // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in + 'BUSINESS_CARD_HU' => array( 141.732, 255.118), // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in + 'BUSINESS_CARD_IL' => array( 141.732, 255.118), // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in + // Billboards + '4SHEET' => array( 2880.000, 4320.000), // = ( 1016 x 1524 ) mm = ( 40.00 x 60.00 ) in + '6SHEET' => array( 3401.575, 5102.362), // = ( 1200 x 1800 ) mm = ( 47.24 x 70.87 ) in + '12SHEET' => array( 8640.000, 4320.000), // = ( 3048 x 1524 ) mm = (120.00 x 60.00 ) in + '16SHEET' => array( 5760.000, 8640.000), // = ( 2032 x 3048 ) mm = ( 80.00 x 120.00) in + '32SHEET' => array(11520.000, 8640.000), // = ( 4064 x 3048 ) mm = (160.00 x 120.00) in + '48SHEET' => array(17280.000, 8640.000), // = ( 6096 x 3048 ) mm = (240.00 x 120.00) in + '64SHEET' => array(23040.000, 8640.000), // = ( 8128 x 3048 ) mm = (320.00 x 120.00) in + '96SHEET' => array(34560.000, 8640.000), // = (12192 x 3048 ) mm = (480.00 x 120.00) in + // -- Old European Sizes + // - Old Imperial English Sizes + 'EN_EMPEROR' => array( 3456.000, 5184.000), // = ( 1219 x 1829 ) mm = ( 48.00 x 72.00 ) in + 'EN_ANTIQUARIAN' => array( 2232.000, 3816.000), // = ( 787 x 1346 ) mm = ( 31.00 x 53.00 ) in + 'EN_GRAND_EAGLE' => array( 2070.000, 3024.000), // = ( 730 x 1067 ) mm = ( 28.75 x 42.00 ) in + 'EN_DOUBLE_ELEPHANT' => array( 1926.000, 2880.000), // = ( 679 x 1016 ) mm = ( 26.75 x 40.00 ) in + 'EN_ATLAS' => array( 1872.000, 2448.000), // = ( 660 x 864 ) mm = ( 26.00 x 34.00 ) in + 'EN_COLOMBIER' => array( 1692.000, 2484.000), // = ( 597 x 876 ) mm = ( 23.50 x 34.50 ) in + 'EN_ELEPHANT' => array( 1656.000, 2016.000), // = ( 584 x 711 ) mm = ( 23.00 x 28.00 ) in + 'EN_DOUBLE_DEMY' => array( 1620.000, 2556.000), // = ( 572 x 902 ) mm = ( 22.50 x 35.50 ) in + 'EN_IMPERIAL' => array( 1584.000, 2160.000), // = ( 559 x 762 ) mm = ( 22.00 x 30.00 ) in + 'EN_PRINCESS' => array( 1548.000, 2016.000), // = ( 546 x 711 ) mm = ( 21.50 x 28.00 ) in + 'EN_CARTRIDGE' => array( 1512.000, 1872.000), // = ( 533 x 660 ) mm = ( 21.00 x 26.00 ) in + 'EN_DOUBLE_LARGE_POST' => array( 1512.000, 2376.000), // = ( 533 x 838 ) mm = ( 21.00 x 33.00 ) in + 'EN_ROYAL' => array( 1440.000, 1800.000), // = ( 508 x 635 ) mm = ( 20.00 x 25.00 ) in + 'EN_SHEET' => array( 1404.000, 1692.000), // = ( 495 x 597 ) mm = ( 19.50 x 23.50 ) in + 'EN_HALF_POST' => array( 1404.000, 1692.000), // = ( 495 x 597 ) mm = ( 19.50 x 23.50 ) in + 'EN_SUPER_ROYAL' => array( 1368.000, 1944.000), // = ( 483 x 686 ) mm = ( 19.00 x 27.00 ) in + 'EN_DOUBLE_POST' => array( 1368.000, 2196.000), // = ( 483 x 775 ) mm = ( 19.00 x 30.50 ) in + 'EN_MEDIUM' => array( 1260.000, 1656.000), // = ( 445 x 584 ) mm = ( 17.50 x 23.00 ) in + 'EN_DEMY' => array( 1260.000, 1620.000), // = ( 445 x 572 ) mm = ( 17.50 x 22.50 ) in + 'EN_LARGE_POST' => array( 1188.000, 1512.000), // = ( 419 x 533 ) mm = ( 16.50 x 21.00 ) in + 'EN_COPY_DRAUGHT' => array( 1152.000, 1440.000), // = ( 406 x 508 ) mm = ( 16.00 x 20.00 ) in + 'EN_POST' => array( 1116.000, 1386.000), // = ( 394 x 489 ) mm = ( 15.50 x 19.25 ) in + 'EN_CROWN' => array( 1080.000, 1440.000), // = ( 381 x 508 ) mm = ( 15.00 x 20.00 ) in + 'EN_PINCHED_POST' => array( 1062.000, 1332.000), // = ( 375 x 470 ) mm = ( 14.75 x 18.50 ) in + 'EN_BRIEF' => array( 972.000, 1152.000), // = ( 343 x 406 ) mm = ( 13.50 x 16.00 ) in + 'EN_FOOLSCAP' => array( 972.000, 1224.000), // = ( 343 x 432 ) mm = ( 13.50 x 17.00 ) in + 'EN_SMALL_FOOLSCAP' => array( 954.000, 1188.000), // = ( 337 x 419 ) mm = ( 13.25 x 16.50 ) in + 'EN_POTT' => array( 900.000, 1080.000), // = ( 318 x 381 ) mm = ( 12.50 x 15.00 ) in + // - Old Imperial Belgian Sizes + 'BE_GRAND_AIGLE' => array( 1984.252, 2948.031), // = ( 700 x 1040 ) mm = ( 27.56 x 40.94 ) in + 'BE_COLOMBIER' => array( 1757.480, 2409.449), // = ( 620 x 850 ) mm = ( 24.41 x 33.46 ) in + 'BE_DOUBLE_CARRE' => array( 1757.480, 2607.874), // = ( 620 x 920 ) mm = ( 24.41 x 36.22 ) in + 'BE_ELEPHANT' => array( 1746.142, 2182.677), // = ( 616 x 770 ) mm = ( 24.25 x 30.31 ) in + 'BE_PETIT_AIGLE' => array( 1700.787, 2381.102), // = ( 600 x 840 ) mm = ( 23.62 x 33.07 ) in + 'BE_GRAND_JESUS' => array( 1559.055, 2069.291), // = ( 550 x 730 ) mm = ( 21.65 x 28.74 ) in + 'BE_JESUS' => array( 1530.709, 2069.291), // = ( 540 x 730 ) mm = ( 21.26 x 28.74 ) in + 'BE_RAISIN' => array( 1417.323, 1842.520), // = ( 500 x 650 ) mm = ( 19.69 x 25.59 ) in + 'BE_GRAND_MEDIAN' => array( 1303.937, 1714.961), // = ( 460 x 605 ) mm = ( 18.11 x 23.82 ) in + 'BE_DOUBLE_POSTE' => array( 1233.071, 1601.575), // = ( 435 x 565 ) mm = ( 17.13 x 22.24 ) in + 'BE_COQUILLE' => array( 1218.898, 1587.402), // = ( 430 x 560 ) mm = ( 16.93 x 22.05 ) in + 'BE_PETIT_MEDIAN' => array( 1176.378, 1502.362), // = ( 415 x 530 ) mm = ( 16.34 x 20.87 ) in + 'BE_RUCHE' => array( 1020.472, 1303.937), // = ( 360 x 460 ) mm = ( 14.17 x 18.11 ) in + 'BE_PROPATRIA' => array( 977.953, 1218.898), // = ( 345 x 430 ) mm = ( 13.58 x 16.93 ) in + 'BE_LYS' => array( 898.583, 1125.354), // = ( 317 x 397 ) mm = ( 12.48 x 15.63 ) in + 'BE_POT' => array( 870.236, 1088.504), // = ( 307 x 384 ) mm = ( 12.09 x 15.12 ) in + 'BE_ROSETTE' => array( 765.354, 983.622), // = ( 270 x 347 ) mm = ( 10.63 x 13.66 ) in + // - Old Imperial French Sizes + 'FR_UNIVERS' => array( 2834.646, 3685.039), // = ( 1000 x 1300 ) mm = ( 39.37 x 51.18 ) in + 'FR_DOUBLE_COLOMBIER' => array( 2551.181, 3571.654), // = ( 900 x 1260 ) mm = ( 35.43 x 49.61 ) in + 'FR_GRANDE_MONDE' => array( 2551.181, 3571.654), // = ( 900 x 1260 ) mm = ( 35.43 x 49.61 ) in + 'FR_DOUBLE_SOLEIL' => array( 2267.717, 3401.575), // = ( 800 x 1200 ) mm = ( 31.50 x 47.24 ) in + 'FR_DOUBLE_JESUS' => array( 2154.331, 3174.803), // = ( 760 x 1120 ) mm = ( 29.92 x 44.09 ) in + 'FR_GRAND_AIGLE' => array( 2125.984, 3004.724), // = ( 750 x 1060 ) mm = ( 29.53 x 41.73 ) in + 'FR_PETIT_AIGLE' => array( 1984.252, 2664.567), // = ( 700 x 940 ) mm = ( 27.56 x 37.01 ) in + 'FR_DOUBLE_RAISIN' => array( 1842.520, 2834.646), // = ( 650 x 1000 ) mm = ( 25.59 x 39.37 ) in + 'FR_JOURNAL' => array( 1842.520, 2664.567), // = ( 650 x 940 ) mm = ( 25.59 x 37.01 ) in + 'FR_COLOMBIER_AFFICHE' => array( 1785.827, 2551.181), // = ( 630 x 900 ) mm = ( 24.80 x 35.43 ) in + 'FR_DOUBLE_CAVALIER' => array( 1757.480, 2607.874), // = ( 620 x 920 ) mm = ( 24.41 x 36.22 ) in + 'FR_CLOCHE' => array( 1700.787, 2267.717), // = ( 600 x 800 ) mm = ( 23.62 x 31.50 ) in + 'FR_SOLEIL' => array( 1700.787, 2267.717), // = ( 600 x 800 ) mm = ( 23.62 x 31.50 ) in + 'FR_DOUBLE_CARRE' => array( 1587.402, 2551.181), // = ( 560 x 900 ) mm = ( 22.05 x 35.43 ) in + 'FR_DOUBLE_COQUILLE' => array( 1587.402, 2494.488), // = ( 560 x 880 ) mm = ( 22.05 x 34.65 ) in + 'FR_JESUS' => array( 1587.402, 2154.331), // = ( 560 x 760 ) mm = ( 22.05 x 29.92 ) in + 'FR_RAISIN' => array( 1417.323, 1842.520), // = ( 500 x 650 ) mm = ( 19.69 x 25.59 ) in + 'FR_CAVALIER' => array( 1303.937, 1757.480), // = ( 460 x 620 ) mm = ( 18.11 x 24.41 ) in + 'FR_DOUBLE_COURONNE' => array( 1303.937, 2040.945), // = ( 460 x 720 ) mm = ( 18.11 x 28.35 ) in + 'FR_CARRE' => array( 1275.591, 1587.402), // = ( 450 x 560 ) mm = ( 17.72 x 22.05 ) in + 'FR_COQUILLE' => array( 1247.244, 1587.402), // = ( 440 x 560 ) mm = ( 17.32 x 22.05 ) in + 'FR_DOUBLE_TELLIERE' => array( 1247.244, 1927.559), // = ( 440 x 680 ) mm = ( 17.32 x 26.77 ) in + 'FR_DOUBLE_CLOCHE' => array( 1133.858, 1700.787), // = ( 400 x 600 ) mm = ( 15.75 x 23.62 ) in + 'FR_DOUBLE_POT' => array( 1133.858, 1757.480), // = ( 400 x 620 ) mm = ( 15.75 x 24.41 ) in + 'FR_ECU' => array( 1133.858, 1474.016), // = ( 400 x 520 ) mm = ( 15.75 x 20.47 ) in + 'FR_COURONNE' => array( 1020.472, 1303.937), // = ( 360 x 460 ) mm = ( 14.17 x 18.11 ) in + 'FR_TELLIERE' => array( 963.780, 1247.244), // = ( 340 x 440 ) mm = ( 13.39 x 17.32 ) in + 'FR_POT' => array( 878.740, 1133.858), // = ( 310 x 400 ) mm = ( 12.20 x 15.75 ) in + ); + + + /** + * Get page dimensions from format name. + * @param $format (mixed) The format name @see self::$page_format
      + * @return array containing page width and height in points + * @since 5.0.010 (2010-05-17) + * @public static + */ + public static function getPageSizeFromFormat($format) { + if (isset(self::$page_formats[$format])) { + return self::$page_formats[$format]; + } + return self::$page_formats['A4']; + } + + /** + * Set page boundaries. + * @param $page (int) page number + * @param $type (string) valid values are:
      • 'MediaBox' : the boundaries of the physical medium on which the page shall be displayed or printed;
      • 'CropBox' : the visible region of default user space;
      • 'BleedBox' : the region to which the contents of the page shall be clipped when output in a production environment;
      • 'TrimBox' : the intended dimensions of the finished page after trimming;
      • 'ArtBox' : the page's meaningful content (including potential white space).
      + * @param $llx (float) lower-left x coordinate in user units. + * @param $lly (float) lower-left y coordinate in user units. + * @param $urx (float) upper-right x coordinate in user units. + * @param $ury (float) upper-right y coordinate in user units. + * @param $points (boolean) If true uses user units as unit of measure, otherwise uses PDF points. + * @param $k (float) Scale factor (number of points in user unit). + * @param $pagedim (array) Array of page dimensions. + * @return pagedim array of page dimensions. + * @since 5.0.010 (2010-05-17) + * @public static + */ + public static function setPageBoxes($page, $type, $llx, $lly, $urx, $ury, $points=false, $k, $pagedim=array()) { + if (!isset($pagedim[$page])) { + // initialize array + $pagedim[$page] = array(); + } + if (!in_array($type, self::$pageboxes)) { + return; + } + if ($points) { + $k = 1; + } + $pagedim[$page][$type]['llx'] = ($llx * $k); + $pagedim[$page][$type]['lly'] = ($lly * $k); + $pagedim[$page][$type]['urx'] = ($urx * $k); + $pagedim[$page][$type]['ury'] = ($ury * $k); + return $pagedim; + } + + /** + * Swap X and Y coordinates of page boxes (change page boxes orientation). + * @param $page (int) page number + * @param $pagedim (array) Array of page dimensions. + * @return pagedim array of page dimensions. + * @since 5.0.010 (2010-05-17) + * @public static + */ + public static function swapPageBoxCoordinates($page, $pagedim) { + foreach (self::$pageboxes as $type) { + // swap X and Y coordinates + if (isset($pagedim[$page][$type])) { + $tmp = $pagedim[$page][$type]['llx']; + $pagedim[$page][$type]['llx'] = $pagedim[$page][$type]['lly']; + $pagedim[$page][$type]['lly'] = $tmp; + $tmp = $pagedim[$page][$type]['urx']; + $pagedim[$page][$type]['urx'] = $pagedim[$page][$type]['ury']; + $pagedim[$page][$type]['ury'] = $tmp; + } + } + return $pagedim; + } + + /** + * Get the canonical page layout mode. + * @param $layout (string) The page layout. Possible values are:
      • SinglePage Display one page at a time
      • OneColumn Display the pages in one column
      • TwoColumnLeft Display the pages in two columns, with odd-numbered pages on the left
      • TwoColumnRight Display the pages in two columns, with odd-numbered pages on the right
      • TwoPageLeft (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the left
      • TwoPageRight (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the right
      + * @return (string) Canonical page layout name. + * @public static + */ + public static function getPageLayoutMode($layout='SinglePage') { + switch ($layout) { + case 'default': + case 'single': + case 'SinglePage': { + $layout_mode = 'SinglePage'; break; } + case 'continuous': + case 'OneColumn': { + $layout_mode = 'OneColumn'; + break; + } + case 'two': + case 'TwoColumnLeft': { + $layout_mode = 'TwoColumnLeft'; + break; + } + case 'TwoColumnRight': { + $layout_mode = 'TwoColumnRight'; + break; + } + case 'TwoPageLeft': { + $layout_mode = 'TwoPageLeft'; + break; + } + case 'TwoPageRight': { + $layout_mode = 'TwoPageRight'; + break; + } + default: { + $layout_mode = 'SinglePage'; + } } - return $ret; + return $layout_mode; } + /** + * Get the canonical page layout mode. + * @param $mode (string) A name object specifying how the document should be displayed when opened:
      • UseNone Neither document outline nor thumbnail images visible
      • UseOutlines Document outline visible
      • UseThumbs Thumbnail images visible
      • FullScreen Full-screen mode, with no menu bar, window controls, or any other window visible
      • UseOC (PDF 1.5) Optional content group panel visible
      • UseAttachments (PDF 1.6) Attachments panel visible
      + * @return (string) Canonical page mode name. + * @public static + */ + public static function getPageMode($mode='UseNone') { + switch ($mode) { + case 'UseNone': { + $page_mode = 'UseNone'; + break; + } + case 'UseOutlines': { + $page_mode = 'UseOutlines'; + break; + } + case 'UseThumbs': { + $page_mode = 'UseThumbs'; + break; + } + case 'FullScreen': { + $page_mode = 'FullScreen'; + break; + } + case 'UseOC': { + $page_mode = 'UseOC'; + break; + } + case '': { + $page_mode = 'UseAttachments'; + break; + } + default: { + $page_mode = 'UseNone'; + } + } + return $page_mode; + } + + } // END OF TCPDF_STATIC CLASS //============================================================+ diff --git a/htdocs/includes/tecnickcom/tcpdf/tcpdf.php b/htdocs/includes/tecnickcom/tcpdf/tcpdf.php index b31e58bb2c6..599a3f8b968 100644 --- a/htdocs/includes/tecnickcom/tcpdf/tcpdf.php +++ b/htdocs/includes/tecnickcom/tcpdf/tcpdf.php @@ -1,9 +1,9 @@ * @package com.tecnick.tcpdf * @author Nicola Asuni - * @version 6.2.6 + * @version 6.2.8 */ // TCPDF configuration @@ -128,7 +128,7 @@ require_once(dirname(__FILE__).'/include/tcpdf_static.php'); * TCPDF project (http://www.tcpdf.org) has been originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.
      * @package com.tecnick.tcpdf * @brief PHP class for generating PDF documents without requiring external extensions. - * @version 6.2.6 + * @version 6.2.8 * @author Nicola Asuni - info@tecnick.com */ class TCPDF { @@ -5748,7 +5748,7 @@ class TCPDF { * @param $autopadding (boolean) if true, uses internal padding and automatically adjust it to account for line width. * @param $maxh (float) maximum height. It should be >= $h and less then remaining space to the bottom of the page, or 0 for disable this feature. This feature works only when $ishtml=false. * @param $valign (string) Vertical alignment of text (requires $maxh = $h > 0). Possible values are:
      • T: TOP
      • M: middle
      • B: bottom
      . This feature works only when $ishtml=false and the cell must fit in a single page. - * @param $fitcell (boolean) if true attempt to fit all the text within the cell by reducing the font size (do not work in HTML mode). $maxh must be greater than 0 and wqual to $h. + * @param $fitcell (boolean) if true attempt to fit all the text within the cell by reducing the font size (do not work in HTML mode). $maxh must be greater than 0 and equal to $h. * @return int Return the number of cells or 1 for html mode. * @public * @since 1.3 @@ -10362,7 +10362,7 @@ class TCPDF { * @public */ public function addHtmlLink($url, $name, $fill=false, $firstline=false, $color='', $style=-1, $firstblock=false) { - if (isset($url[1]) AND ($url[0] == '#')) { + if (isset($url[1]) AND ($url[0] == '#') AND is_numeric($url[1])) { // convert url to internal link $lnkdata = explode(',', $url); if (isset($lnkdata[0]) ) { @@ -10632,8 +10632,7 @@ class TCPDF { */ protected function _UEvalue() { $hashkey = hash('sha256', $this->encryptdata['user_password'].$this->encryptdata['UKS'], true); - $iv = str_repeat("\x00", mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)); - return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $hashkey, $this->encryptdata['key'], MCRYPT_MODE_CBC, $iv); + return TCPDF_STATIC::_AESnopad($hashkey, $this->encryptdata['key']); } /** @@ -10683,8 +10682,7 @@ class TCPDF { */ protected function _OEvalue() { $hashkey = hash('sha256', $this->encryptdata['owner_password'].$this->encryptdata['OKS'].$this->encryptdata['U'], true); - $iv = str_repeat("\x00", mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)); - return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $hashkey, $this->encryptdata['key'], MCRYPT_MODE_CBC, $iv); + return TCPDF_STATIC::_AESnopad($hashkey, $this->encryptdata['key']); } /** @@ -10739,8 +10737,7 @@ class TCPDF { } $perms .= 'adb'; // bytes 9-11 $perms .= 'nick'; // bytes 12-15 - $iv = str_repeat("\x00", mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB)); - $this->encryptdata['perms'] = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->encryptdata['key'], $perms, MCRYPT_MODE_ECB, $iv); + $this->encryptdata['perms'] = TCPDF_STATIC::_AESnopad($this->encryptdata['key'], $perms); } else { // RC4-40, RC4-128, AES-128 // Pad passwords $this->encryptdata['user_password'] = substr($this->encryptdata['user_password'].TCPDF_STATIC::$enc_padding, 0, 32); @@ -10858,10 +10855,13 @@ class TCPDF { $this->encryptdata['StrF'] = 'StdCF'; } if ($mode > 1) { // AES - if (!extension_loaded('mcrypt')) { - $this->Error('AES encryption requires mcrypt library (http://www.php.net/manual/en/mcrypt.requirements.php).'); + if (!extension_loaded('openssl') && !extension_loaded('mcrypt')) { + $this->Error('AES encryption requires openssl or mcrypt extension (http://www.php.net/manual/en/mcrypt.requirements.php).'); } - if (mcrypt_get_cipher_name(MCRYPT_RIJNDAEL_128) === false) { + if (extension_loaded('openssl') && !in_array('aes-256-cbc', openssl_get_cipher_methods())) { + $this->Error('AES encryption requires openssl/aes-256-cbc cypher.'); + } + if (extension_loaded('mcrypt') && mcrypt_get_cipher_name(MCRYPT_RIJNDAEL_128) === false) { $this->Error('AES encryption requires MCRYPT_RIJNDAEL_128 cypher.'); } if (($mode == 3) AND !function_exists('hash')) { @@ -18649,7 +18649,7 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: $this->lispacer = $prev_lispacer; if ($ln AND (!($cell AND ($dom[$key-1]['value'] == 'table')))) { $this->Ln($this->lasth); - if ($this->y < $maxbottomliney) { + if (($this->y < $maxbottomliney) AND ($startlinepage == $this->page)) { $this->y = $maxbottomliney; } } @@ -19427,8 +19427,9 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: $prev_page = $this->page; $this->setPage($dom[($dom[$key]['parent'])]['endpage']); if ($this->num_columns > 1) { - if ((($this->current_column == 0) AND ($dom[($dom[$key]['parent'])]['endcolumn'] == ($this->num_columns - 1))) - OR (($this->current_column == $dom[($dom[$key]['parent'])]['endcolumn']) AND ($prev_page < $this->page))) { + if (($prev_page < $this->page) + AND ((($this->current_column == 0) AND ($dom[($dom[$key]['parent'])]['endcolumn'] == ($this->num_columns - 1))) + OR ($this->current_column == $dom[($dom[$key]['parent'])]['endcolumn']))) { // page jump $this->selectColumn(0); $dom[($dom[$key]['parent'])]['endcolumn'] = 0; diff --git a/htdocs/includes/tecnickcom/tcpdf/tcpdf_parser.php b/htdocs/includes/tecnickcom/tcpdf/tcpdf_parser.php index 85fc7fd3df3..780ec2129d1 100644 --- a/htdocs/includes/tecnickcom/tcpdf/tcpdf_parser.php +++ b/htdocs/includes/tecnickcom/tcpdf/tcpdf_parser.php @@ -1,9 +1,9 @@ $v) { if (($v[0] == '/') AND ($v[1] == 'Type') AND (isset($sarr[($k +1)]) AND ($sarr[($k +1)][0] == '/') AND ($sarr[($k +1)][1] == 'XRef'))) { $valid_crs = true; From 8904828069474dae71e0d34865f8ed1ef0ef8626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 7 Dec 2015 13:48:04 +0100 Subject: [PATCH 159/206] Fix #3962 Moved removed libraries to suggest section --- composer.json | 8 ++--- composer.lock | 94 ++------------------------------------------------- 2 files changed, 6 insertions(+), 96 deletions(-) diff --git a/composer.json b/composer.json index afd53001f71..06d90c0e02e 100644 --- a/composer.json +++ b/composer.json @@ -21,9 +21,7 @@ "mobiledetect/mobiledetectlib": "2.8.3", "phpoffice/phpexcel": "1.8.1", "restler/framework": "^3.0", - "tecnickcom/tcpdf": "6.2.12", - "raven/raven": "^0.12.0", - "firephp/firephp-core": "^0.4.0" + "tecnickcom/tcpdf": "6.2.12" }, "suggest": { "ext-mysqlnd": "To use with MySQL or MariaDB", @@ -38,7 +36,9 @@ "ext-mbstring": "Handle non UTF-8 databases", "ext-soap": "Native SOAP", "ext-zip": "ODT and Excel support", - "ext-xml": "Excel support" + "ext-xml": "Excel support", + "firephp/firephp-core": "Logging to Firebug console support", + "raven/raven": "Sentry logging server support" }, "config": { "vendor-dir": "htdocs/includes" diff --git a/composer.lock b/composer.lock index fc8df3719ac..d29035c7329 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "e4ff9778aef8c35c239457e96b32ee5c", - "content-hash": "e98d327da132b265127ad23d79a49578", + "hash": "8359ca16a39a2910cad7f36784d10972", + "content-hash": "a7d53767afa4dc32484fac05f6ffde67", "packages": [ { "name": "ccampbell/chromephp", @@ -91,42 +91,6 @@ ], "time": "2014-02-26 15:43:10" }, - { - "name": "firephp/firephp-core", - "version": "v0.4.0", - "source": { - "type": "git", - "url": "https://github.com/firephp/firephp-core.git", - "reference": "fabad0f2503f9577fe8dd2cb1d1c7cd73ed2aacf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/firephp/firephp-core/zipball/fabad0f2503f9577fe8dd2cb1d1c7cd73ed2aacf", - "reference": "fabad0f2503f9577fe8dd2cb1d1c7cd73ed2aacf", - "shasum": "" - }, - "type": "library", - "autoload": { - "classmap": [ - "lib/FirePHPCore/FirePHP.class.php", - "lib/FirePHPCore/fb.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christoph Dorn", - "email": "christoph@christophdorn.com", - "homepage": "http://christophdorn.com" - } - ], - "description": "Traditional FirePHPCore library for sending PHP variables to the browser.", - "homepage": "https://github.com/firephp/firephp-core", - "time": "2013-04-23 15:28:20" - }, { "name": "mike42/escpos-php", "version": "dev-master", @@ -294,60 +258,6 @@ ], "time": "2015-05-01 07:00:55" }, - { - "name": "raven/raven", - "version": "0.12.1", - "source": { - "type": "git", - "url": "https://github.com/getsentry/raven-php.git", - "reference": "b325984c792ff89f985b73da9a3ad8ed8b520bca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getsentry/raven-php/zipball/b325984c792ff89f985b73da9a3ad8ed8b520bca", - "reference": "b325984c792ff89f985b73da9a3ad8ed8b520bca", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "php": ">=5.2.4" - }, - "require-dev": { - "fabpot/php-cs-fixer": "^1.8.0", - "phpunit/phpunit": "^4.6.6" - }, - "bin": [ - "bin/raven" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.12.x-dev" - } - }, - "autoload": { - "psr-0": { - "Raven_": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD" - ], - "authors": [ - { - "name": "David Cramer", - "email": "dcramer@gmail.com" - } - ], - "description": "A PHP client for Sentry (http://getsentry.com)", - "homepage": "http://getsentry.com", - "keywords": [ - "log", - "logging" - ], - "time": "2015-08-25 22:38:46" - }, { "name": "restler/framework", "version": "3.0.0", From 9257bfc5df4f85362bb3c89bf8a4daea430fd5c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 7 Dec 2015 13:53:59 +0100 Subject: [PATCH 160/206] Updated mobiledetect to 2.8.17 --- COPYRIGHT | 2 +- composer.json | 2 +- composer.lock | 18 +- .../mobiledetect/mobiledetectlib/.gitignore | 4 +- .../mobiledetect/mobiledetectlib/.travis.yml | 7 +- .../mobiledetect/mobiledetectlib/LICENSE.txt | 2 +- .../mobiledetectlib/Mobile_Detect.json | 190 +- .../mobiledetectlib/Mobile_Detect.php | 608 +- .../mobiledetect/mobiledetectlib/README.md | 120 +- .../mobiledetectlib/composer.json | 4 +- .../mobiledetectlib/composer.lock | 439 - .../mobiledetectlib/examples/demo.php | 16 +- .../mobiledetectlib/examples/test.php | 29 + .../mobiledetectlib/export/exportToJSON.php | 4 +- .../mobiledetectlib/tests/BasicsTest.php | 80 +- .../mobiledetectlib/tests/UA_List.inc.php | 1231 +-- .../mobiledetectlib/tests/UserAgentTest.php | 59 +- .../{VendorsTest.php => VendorsTest_tmp.php} | 44 +- .../mobiledetectlib/tests/phpunit.xml | 14 +- .../tests/providers/vendors/Acer.php | 28 + .../tests/providers/vendors/Alcatel.php | 49 + .../tests/providers/vendors/Allview.php | 11 + .../tests/providers/vendors/Amazon.php | 14 + .../tests/providers/vendors/Apple.php | 27 + .../tests/providers/vendors/Archos.php | 67 + .../tests/providers/vendors/Asus.php | 22 + .../tests/providers/vendors/Blackberry.php | 35 + .../tests/providers/vendors/Dell.php | 13 + .../tests/providers/vendors/Google.php | 18 + .../tests/providers/vendors/HP.php | 21 + .../tests/providers/vendors/HTC.php | 363 + .../tests/providers/vendors/Huawei.php | 17 + .../tests/providers/vendors/LG.php | 35 + .../tests/providers/vendors/Lava.php | 23 + .../tests/providers/vendors/Leader.php | 6 + .../tests/providers/vendors/Lenovo.php | 46 + .../tests/providers/vendors/Mi.php | 22 + .../tests/providers/vendors/Microsoft.php | 30 + .../tests/providers/vendors/Motorola.php | 52 + .../tests/providers/vendors/Nokia.php | 84 + .../tests/providers/vendors/Onda.php | 12 + .../tests/providers/vendors/Others.php | 531 ++ .../tests/providers/vendors/Prestigio.php | 12 + .../tests/providers/vendors/Samsung.php | 131 + .../tests/providers/vendors/Sony.php | 85 + .../tests/providers/vendors/SpecialCases.php | 206 + .../tests/providers/vendors/Vodafone.php | 11 + .../tests/providers/vendors/ZTE.php | 6 + .../mobiledetectlib/tests/ualist.json | 8197 ++++++++++++++++- 49 files changed, 10846 insertions(+), 2201 deletions(-) delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/composer.lock create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/examples/test.php mode change 100644 => 100755 htdocs/includes/mobiledetect/mobiledetectlib/tests/BasicsTest.php rename htdocs/includes/mobiledetect/mobiledetectlib/tests/{VendorsTest.php => VendorsTest_tmp.php} (60%) create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Acer.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Alcatel.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Allview.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Amazon.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Apple.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Archos.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Asus.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Blackberry.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Dell.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Google.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HP.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HTC.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Huawei.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/LG.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lava.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Leader.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lenovo.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Mi.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Microsoft.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Motorola.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Nokia.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Onda.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Others.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Prestigio.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Samsung.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Sony.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/SpecialCases.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Vodafone.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/ZTE.php diff --git a/COPYRIGHT b/COPYRIGHT index a0cf842b885..191639ed001 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -19,7 +19,7 @@ EvalMath 1.0 BSD Yes Escpos-php MIT License Yes Thermal receipt printer library, for use with ESC/POS compatible printers FPDI 1.5.2 Apache Software License 2.0 Yes PDF templates management GeoIP 1.4 LGPL-2.1+ Yes Sample code to make geoip convert (not into deb package) -Mobiledetect 2.8.3 MIT License Yes Detect mobile devices browsers +Mobiledetect 2.8.17 MIT License Yes Detect mobile devices browsers NuSoap 0.9.5 LGPL 2.1+ Yes Library to develop SOAP Web services (not into rpm and deb package) PEAR Mail_MIME 1.8.9 BSD Yes NuSoap dependency odtPHP 1.0.1 GPL-2+ b Yes Library to build/edit ODT files diff --git a/composer.json b/composer.json index 06d90c0e02e..583e08078af 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,7 @@ "ccampbell/chromephp": "^4.1", "ckeditor/ckeditor": "dev-full/4.3.x#0b7c3f1", "mike42/escpos-php": "dev-master", - "mobiledetect/mobiledetectlib": "2.8.3", + "mobiledetect/mobiledetectlib": "2.8.17", "phpoffice/phpexcel": "1.8.1", "restler/framework": "^3.0", "tecnickcom/tcpdf": "6.2.12" diff --git a/composer.lock b/composer.lock index d29035c7329..da19c20fbc5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "8359ca16a39a2910cad7f36784d10972", - "content-hash": "a7d53767afa4dc32484fac05f6ffde67", + "hash": "d8229cbb9aea945c9ca803bbe54d7aa7", + "content-hash": "47929ed42fb67e5159ccec6a3a5a45eb", "packages": [ { "name": "ccampbell/chromephp", @@ -151,22 +151,24 @@ }, { "name": "mobiledetect/mobiledetectlib", - "version": "2.8.3", + "version": "2.8.17", "source": { "type": "git", "url": "https://github.com/serbanghita/Mobile-Detect.git", - "reference": "f5753e4b90daffe50c902e99df5ce3c58fca3fee" + "reference": "b87da5f63a76e9615a0c74fcf168657b1ea7e41d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/f5753e4b90daffe50c902e99df5ce3c58fca3fee", - "reference": "f5753e4b90daffe50c902e99df5ce3c58fca3fee", + "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/b87da5f63a76e9615a0c74fcf168657b1ea7e41d", + "reference": "b87da5f63a76e9615a0c74fcf168657b1ea7e41d", "shasum": "" }, "require": { "php": ">=5.0.0" }, "require-dev": { + "codeclimate/php-test-reporter": "dev-master", + "johnkary/phpunit-speedtrap": "~1.0@dev", "phpunit/phpunit": "*" }, "type": "library", @@ -186,7 +188,7 @@ { "name": "Serban Ghita", "email": "serbanghita@gmail.com", - "homepage": "http://ghita.org", + "homepage": "http://mobiledetect.net", "role": "Developer" } ], @@ -199,7 +201,7 @@ "mobile detector", "php mobile detect" ], - "time": "2014-07-10 20:00:25" + "time": "2015-09-17 14:45:21" }, { "name": "phpoffice/phpexcel", diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/.gitignore b/htdocs/includes/mobiledetect/mobiledetectlib/.gitignore index 5e9bd942345..48b35e71455 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/.gitignore +++ b/htdocs/includes/mobiledetect/mobiledetectlib/.gitignore @@ -6,4 +6,6 @@ nbproject/ /error.log /export/nicejson .idea/ -*.iml \ No newline at end of file +*.iml +/coverage +/phpunit.phar diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/.travis.yml b/htdocs/includes/mobiledetect/mobiledetectlib/.travis.yml index 7c5ebf36c2a..29af5249f0d 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/.travis.yml +++ b/htdocs/includes/mobiledetect/mobiledetectlib/.travis.yml @@ -1,14 +1,17 @@ language: php php: - "5.2" - - "hhvm" + - "5.3" + - "5.4" + - "5.5" + - "5.6" branches: only: - devel script: - - phpunit --configuration tests/phpunit.xml + - phpunit -v -c tests/phpunit.xml notifications: email: false diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/LICENSE.txt b/htdocs/includes/mobiledetect/mobiledetectlib/LICENSE.txt index 101abf8be5f..90e632a7875 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/LICENSE.txt +++ b/htdocs/includes/mobiledetect/mobiledetectlib/LICENSE.txt @@ -1,6 +1,6 @@ MIT License -Copyright (c) <2011-2014> +Copyright (c) <2011-2015> Serban Ghita, Nick Ilyin and contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.json b/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.json index 7d61f6f9dee..323b1e2a50a 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.json +++ b/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.json @@ -1,189 +1 @@ -{ - "version": "2.8.3", - "headerMatch": { - "HTTP_ACCEPT": { - "matches": [ - "application\/x-obml2d", - "application\/vnd.rim.html", - "text\/vnd.wap.wml", - "application\/vnd.wap.xhtml+xml" - ] - }, - "HTTP_X_WAP_PROFILE": null, - "HTTP_X_WAP_CLIENTID": null, - "HTTP_WAP_CONNECTION": null, - "HTTP_PROFILE": null, - "HTTP_X_OPERAMINI_PHONE_UA": null, - "HTTP_X_NOKIA_GATEWAY_ID": null, - "HTTP_X_ORANGE_ID": null, - "HTTP_X_VODAFONE_3GPDPCONTEXT": null, - "HTTP_X_HUAWEI_USERID": null, - "HTTP_UA_OS": null, - "HTTP_X_MOBILE_GATEWAY": null, - "HTTP_X_ATT_DEVICEID": null, - "HTTP_UA_CPU": { - "matches": [ - "ARM" - ] - } - }, - "uaHttpHeaders": [ - "HTTP_USER_AGENT", - "HTTP_X_OPERAMINI_PHONE_UA", - "HTTP_X_DEVICE_USER_AGENT", - "HTTP_X_ORIGINAL_USER_AGENT", - "HTTP_X_SKYFIRE_PHONE", - "HTTP_X_BOLT_PHONE_UA", - "HTTP_DEVICE_STOCK_UA", - "HTTP_X_UCBROWSER_DEVICE_UA" - ], - "uaMatch": { - "phones": { - "iPhone": "\\biPhone.*(Mobile|PhoneGap)|\\biPod", - "BlackBerry": "BlackBerry|\\bBB10\\b|rim[0-9]+", - "HTC": "HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\bEVO\\b|T-Mobile G1|Z520m", - "Nexus": "Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile", - "Dell": "Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\\b001DL\\b|\\b101DL\\b|\\bGS01\\b", - "Motorola": "Motorola|DROIDX|DROID BIONIC|\\bDroid\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925", - "Samsung": "Samsung|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E", - "LG": "\\bLG\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)", - "Sony": "SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i", - "Asus": "Asus.*Galaxy|PadFone.*Mobile", - "Micromax": "Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b", - "Palm": "PalmSource|Palm", - "Vertu": "Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature", - "Pantech": "PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790", - "Fly": "IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250", - "iMobile": "i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)", - "SimValley": "\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b", - "GenericPhone": "Tapatalk|PDA;|SAGEM|\\bmmp\\b|pocket|\\bpsp\\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\\bwap\\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser" - }, - "tablets": { - "iPad": "iPad|iPad.*Mobile", - "NexusTablet": "Android.*Nexus[\\s]+(7|10)|^.*Android.*Nexus(?:(?!Mobile).)*$", - "SamsungTablet": "SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-I9205|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705C|SM-T535|SM-T331", - "Kindle": "Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE)\\b", - "SurfaceTablet": "Windows NT [0-9.]+; ARM;", - "HPTablet": "HP Slate 7|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8", - "AsusTablet": "^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\\bK00F\\b|TX201LA", - "BlackBerryTablet": "PlayBook|RIM Tablet", - "HTCtablet": "HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200", - "MotorolaTablet": "xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617", - "NookTablet": "Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2", - "AcerTablet": "Android.*; \\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-830)\\b|W3-810|\\bA3-A10\\b", - "ToshibaTablet": "Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO", - "LGTablet": "\\bL-06C|LG-V900|LG-V500|LG-V909|LG-V500|LG-V510|LG-VK810\\b", - "FujitsuTablet": "Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b", - "PrestigioTablet": "PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD", - "LenovoTablet": "IdeaTab|ThinkPad([ ]+)?Tablet|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A1000|A2107|A2109|A1107|B6000|B8000|B8080-F)", - "YarvikTablet": "Android.*\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\b", - "MedionTablet": "Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB", - "ArnovaTablet": "AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT", - "IntensoTablet": "INM8002KP|INM1010FP|INM805ND|Intenso Tab", - "IRUTablet": "M702pro", - "MegafonTablet": "MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b", - "EbodaTablet": "E-Boda (Supreme|Impresspeed|Izzycomm|Essential)", - "AllViewTablet": "Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)", - "ArchosTablet": "\\b(101G9|80G9|A101IT)\\b|Qilive 97R|ARCHOS 101G10|Archos 101 Neon", - "AinolTablet": "NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark", - "SonyTablet": "Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551", - "CubeTablet": "Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT", - "CobyTablet": "MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010", - "MIDTablet": "M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733", - "SMiTTablet": "Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)", - "RockChipTablet": "Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A", - "FlyTablet": "IQ310|Fly Vision", - "bqTablet": "bq.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant)|Maxwell.*Lite|Maxwell.*Plus", - "HuaweiTablet": "MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim", - "NecTablet": "\\bN-06D|\\bN-08D", - "PantechTablet": "Pantech.*P4100", - "BronchoTablet": "Broncho.*(N701|N708|N802|a710)", - "VersusTablet": "TOUCHPAD.*[78910]|\\bTOUCHTAB\\b", - "ZyncTablet": "z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900", - "PositivoTablet": "TB07STA|TB10STA|TB07FTA|TB10FTA", - "NabiTablet": "Android.*\\bNabi", - "KoboTablet": "Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build", - "DanewTablet": "DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b", - "TexetTablet": "NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE", - "PlaystationTablet": "Playstation.*(Portable|Vita)", - "TrekstorTablet": "ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A", - "PyleAudioTablet": "\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b", - "AdvanTablet": "Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b ", - "DanyTechTablet": "Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1", - "GalapadTablet": "Android.*\\bG1\\b", - "MicromaxTablet": "Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b", - "KarbonnTablet": "Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b", - "AllFineTablet": "Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide", - "PROSCANTablet": "\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b", - "YONESTablet": "BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026", - "ChangJiaTablet": "TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503", - "GUTablet": "TX-A1301|TX-M9002|Q702|kf026", - "PointOfViewTablet": "TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10", - "OvermaxTablet": "OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)", - "HCLTablet": "HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync", - "DPSTablet": "DPS Dream 9|DPS Dual 7", - "VistureTablet": "V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10", - "CrestaTablet": "CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989", - "MediatekTablet": "\\bMT8125|MT8389|MT8135|MT8377\\b", - "ConcordeTablet": "Concorde([ ]+)?Tab|ConCorde ReadMan", - "GoCleverTablet": "GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042", - "ModecomTablet": "FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003", - "VoninoTablet": "\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b", - "ECSTablet": "V07OT2|TM105A|S10OT1|TR10CS1", - "StorexTablet": "eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab", - "VodafoneTablet": "SmartTab([ ]+)?[0-9]+|SmartTabII10", - "EssentielBTablet": "Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2", - "RossMoorTablet": "RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711", - "iMobileTablet": "i-mobile i-note", - "TolinoTablet": "tolino tab [0-9.]+|tolino shine", - "AudioSonicTablet": "\\bC-22Q|T7-QC|T-17B|T-17P\\b", - "AMPETablet": "Android.* A78 ", - "SkkTablet": "Android.* (SKYPAD|PHOENIX|CYCLOPS)", - "TecnoTablet": "TECNO P9", - "JXDTablet": "Android.*\\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\\b", - "iJoyTablet": "Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)", - "FX2Tablet": "FX2 PAD7|FX2 PAD10", - "XoroTablet": "KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151", - "ViewsonicTablet": "ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a", - "OdysTablet": "LOOX|XENO10|ODYS Space", - "CaptivaTablet": "CAPTIVA PAD", - "IconbitTablet": "NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S", - "Hudl": "Hudl HT7S3", - "TelstraTablet": "T-Hub2", - "GenericTablet": "Android.*\\b97D\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\bA7EB\\b|CatNova8|A1_07|CT704|CT1002|\\bM721\\b|rk30sdk|\\bEVOTAB\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4" - }, - "browsers": { - "Chrome": "\\bCrMo\\b|CriOS|Android.*Chrome\/[.0-9]* (Mobile)?", - "Dolfin": "\\bDolfin\\b", - "Opera": "Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\/[0-9.]+|Coast\/[0-9.]+", - "Skyfire": "Skyfire", - "IE": "IEMobile|MSIEMobile", - "Firefox": "fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile", - "Bolt": "bolt", - "TeaShark": "teashark", - "Blazer": "Blazer", - "Safari": "Version.*Mobile.*Safari|Safari.*Mobile", - "Tizen": "Tizen", - "UCBrowser": "UC.*Browser|UCWEB", - "DiigoBrowser": "DiigoBrowser", - "Puffin": "Puffin", - "Mercury": "\\bMercury\\b", - "GenericBrowser": "NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger" - }, - "os": { - "AndroidOS": "Android", - "BlackBerryOS": "blackberry|\\bBB10\\b|rim tablet os", - "PalmOS": "PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino", - "SymbianOS": "Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\bS60\\b", - "WindowsMobileOS": "Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;", - "WindowsPhoneOS": "Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7", - "iOS": "\\biPhone.*Mobile|\\biPod|\\biPad", - "MeeGoOS": "MeeGo", - "MaemoOS": "Maemo", - "JavaOS": "J2ME\/|\\bMIDP\\b|\\bCLDC\\b", - "webOS": "webOS|hpwOS", - "badaOS": "\\bBada\\b", - "BREWOS": "BREW" - } - } -} \ No newline at end of file +{"version":"2.8.17","headerMatch":{"HTTP_ACCEPT":{"matches":["application\/x-obml2d","application\/vnd.rim.html","text\/vnd.wap.wml","application\/vnd.wap.xhtml+xml"]},"HTTP_X_WAP_PROFILE":null,"HTTP_X_WAP_CLIENTID":null,"HTTP_WAP_CONNECTION":null,"HTTP_PROFILE":null,"HTTP_X_OPERAMINI_PHONE_UA":null,"HTTP_X_NOKIA_GATEWAY_ID":null,"HTTP_X_ORANGE_ID":null,"HTTP_X_VODAFONE_3GPDPCONTEXT":null,"HTTP_X_HUAWEI_USERID":null,"HTTP_UA_OS":null,"HTTP_X_MOBILE_GATEWAY":null,"HTTP_X_ATT_DEVICEID":null,"HTTP_UA_CPU":{"matches":["ARM"]}},"uaHttpHeaders":["HTTP_USER_AGENT","HTTP_X_OPERAMINI_PHONE_UA","HTTP_X_DEVICE_USER_AGENT","HTTP_X_ORIGINAL_USER_AGENT","HTTP_X_SKYFIRE_PHONE","HTTP_X_BOLT_PHONE_UA","HTTP_DEVICE_STOCK_UA","HTTP_X_UCBROWSER_DEVICE_UA"],"uaMatch":{"phones":{"iPhone":"\\biPhone\\b|\\biPod\\b","BlackBerry":"BlackBerry|\\bBB10\\b|rim[0-9]+","HTC":"HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\bEVO\\b|T-Mobile G1|Z520m","Nexus":"Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6","Dell":"Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\\b001DL\\b|\\b101DL\\b|\\bGS01\\b","Motorola":"Motorola|DROIDX|DROID BIONIC|\\bDroid\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\bMoto E\\b","Samsung":"Samsung|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205","LG":"\\bLG\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)","Sony":"SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533","Asus":"Asus.*Galaxy|PadFone.*Mobile","Micromax":"Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b","Palm":"PalmSource|Palm","Vertu":"Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature","Pantech":"PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790","Fly":"IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250","Wiko":"KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM","iMobile":"i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)","SimValley":"\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b","Wolfgang":"AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q","Alcatel":"Alcatel","Nintendo":"Nintendo 3DS","Amoi":"Amoi","INQ":"INQ","GenericPhone":"Tapatalk|PDA;|SAGEM|\\bmmp\\b|pocket|\\bpsp\\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\\bwap\\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser"},"tablets":{"iPad":"iPad|iPad.*Mobile","NexusTablet":"Android.*Nexus[\\s]+(7|9|10)","SamsungTablet":"SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T360","Kindle":"Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI)\\b","SurfaceTablet":"Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)","HPTablet":"HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10","AsusTablet":"^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\\bK00F\\b|\\bK00C\\b|\\bK00E\\b|\\bK00L\\b|TX201LA|ME176C|ME102A|\\bM80TA\\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K017 |ME572C|ME103K|ME170C|ME171C|\\bME70C\\b|ME581C|ME581CL|ME8510C|ME181C","BlackBerryTablet":"PlayBook|RIM Tablet","HTCtablet":"HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410","MotorolaTablet":"xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617","NookTablet":"Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2","AcerTablet":"Android.*; \\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\b|W3-810|\\bA3-A10\\b|\\bA3-A11\\b","ToshibaTablet":"Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO","LGTablet":"\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\b","FujitsuTablet":"Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b","PrestigioTablet":"PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002","LenovoTablet":"Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)","DellTablet":"Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7","YarvikTablet":"Android.*\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\b","MedionTablet":"Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB","ArnovaTablet":"AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2","IntensoTablet":"INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004","IRUTablet":"M702pro","MegafonTablet":"MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b","EbodaTablet":"E-Boda (Supreme|Impresspeed|Izzycomm|Essential)","AllViewTablet":"Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)","ArchosTablet":"\\b(101G9|80G9|A101IT)\\b|Qilive 97R|Archos5|\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\b","AinolTablet":"NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark","SonyTablet":"Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31","PhilipsTablet":"\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\b","CubeTablet":"Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT","CobyTablet":"MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010","MIDTablet":"M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733","MSITablet":"MSI \\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\b","SMiTTablet":"Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)","RockChipTablet":"Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A","FlyTablet":"IQ310|Fly Vision","bqTablet":"Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris E10)|Maxwell.*Lite|Maxwell.*Plus","HuaweiTablet":"MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim","NecTablet":"\\bN-06D|\\bN-08D","PantechTablet":"Pantech.*P4100","BronchoTablet":"Broncho.*(N701|N708|N802|a710)","VersusTablet":"TOUCHPAD.*[78910]|\\bTOUCHTAB\\b","ZyncTablet":"z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900","PositivoTablet":"TB07STA|TB10STA|TB07FTA|TB10FTA","NabiTablet":"Android.*\\bNabi","KoboTablet":"Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build","DanewTablet":"DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b","TexetTablet":"NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE","PlaystationTablet":"Playstation.*(Portable|Vita)","TrekstorTablet":"ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab","PyleAudioTablet":"\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b","AdvanTablet":"Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b ","DanyTechTablet":"Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1","GalapadTablet":"Android.*\\bG1\\b","MicromaxTablet":"Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b","KarbonnTablet":"Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b","AllFineTablet":"Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide","PROSCANTablet":"\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b","YONESTablet":"BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026","ChangJiaTablet":"TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503","GUTablet":"TX-A1301|TX-M9002|Q702|kf026","PointOfViewTablet":"TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10","OvermaxTablet":"OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)","HCLTablet":"HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync","DPSTablet":"DPS Dream 9|DPS Dual 7","VistureTablet":"V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10","CrestaTablet":"CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989","MediatekTablet":"\\bMT8125|MT8389|MT8135|MT8377\\b","ConcordeTablet":"Concorde([ ]+)?Tab|ConCorde ReadMan","GoCleverTablet":"GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042","ModecomTablet":"FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003","VoninoTablet":"\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b","ECSTablet":"V07OT2|TM105A|S10OT1|TR10CS1","StorexTablet":"eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab","VodafoneTablet":"SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7","EssentielBTablet":"Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2","RossMoorTablet":"RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711","iMobileTablet":"i-mobile i-note","TolinoTablet":"tolino tab [0-9.]+|tolino shine","AudioSonicTablet":"\\bC-22Q|T7-QC|T-17B|T-17P\\b","AMPETablet":"Android.* A78 ","SkkTablet":"Android.* (SKYPAD|PHOENIX|CYCLOPS)","TecnoTablet":"TECNO P9","JXDTablet":"Android.*\\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\\b","iJoyTablet":"Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)","FX2Tablet":"FX2 PAD7|FX2 PAD10","XoroTablet":"KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151","ViewsonicTablet":"ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a","OdysTablet":"LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\bXELIO\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10","CaptivaTablet":"CAPTIVA PAD","IconbitTablet":"NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S","TeclastTablet":"T98 4G|\\bP80\\b|\\bX90HD\\b|X98 Air|X98 Air 3G|\\bX89\\b|P80 3G|\\bX80h\\b|P98 Air|\\bX89HD\\b|P98 3G|\\bP90HD\\b|P89 3G|X98 3G|\\bP70h\\b|P79HD 3G|G18d 3G|\\bP79HD\\b|\\bP89s\\b|\\bA88\\b|\\bP10HD\\b|\\bP19HD\\b|G18 3G|\\bP78HD\\b|\\bA78\\b|\\bP75\\b|G17s 3G|G17h 3G|\\bP85t\\b|\\bP90\\b|\\bP11\\b|\\bP98t\\b|\\bP98HD\\b|\\bG18d\\b|\\bP85s\\b|\\bP11HD\\b|\\bP88s\\b|\\bA80HD\\b|\\bA80se\\b|\\bA10h\\b|\\bP89\\b|\\bP78s\\b|\\bG18\\b|\\bP85\\b|\\bA70h\\b|\\bA70\\b|\\bG17\\b|\\bP18\\b|\\bA80s\\b|\\bA11s\\b|\\bP88HD\\b|\\bA80h\\b|\\bP76s\\b|\\bP76h\\b|\\bP98\\b|\\bA10HD\\b|\\bP78\\b|\\bP88\\b|\\bA11\\b|\\bA10t\\b|\\bP76a\\b|\\bP76t\\b|\\bP76e\\b|\\bP85HD\\b|\\bP85a\\b|\\bP86\\b|\\bP75HD\\b|\\bP76v\\b|\\bA12\\b|\\bP75a\\b|\\bA15\\b|\\bP76Ti\\b|\\bP81HD\\b|\\bA10\\b|\\bT760VE\\b|\\bT720HD\\b|\\bP76\\b|\\bP73\\b|\\bP71\\b|\\bP72\\b|\\bT720SE\\b|\\bC520Ti\\b|\\bT760\\b|\\bT720VE\\b|T720-3GE|T720-WiFi","OndaTablet":"\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\\b[\\s]+","JaytechTablet":"TPC-PA762","BlaupunktTablet":"Endeavour 800NG|Endeavour 1010","DigmaTablet":"\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\b","EvolioTablet":"ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\bEvotab\\b|\\bNeura\\b","LavaTablet":"QPAD E704|\\bIvoryS\\b|E-TAB IVORY|\\bE-TAB\\b","CelkonTablet":"CT695|CT888|CT[\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\bCT-1\\b","WolderTablet":"miTab \\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\b","MiTablet":"\\bMI PAD\\b|\\bHM NOTE 1W\\b","NibiruTablet":"Nibiru M1|Nibiru Jupiter One","NexoTablet":"NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI","LeaderTablet":"TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100","UbislateTablet":"UbiSlate[\\s]?7C","PocketBookTablet":"Pocketbook","Hudl":"Hudl HT7S3","TelstraTablet":"T-Hub2","GenericTablet":"Android.*\\b97D\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\bA7EB\\b|CatNova8|A1_07|CT704|CT1002|\\bM721\\b|rk30sdk|\\bEVOTAB\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\\bM6pro\\b|CT1020W|arc 10HD|\\bJolla\\b|\\bTP750\\b"},"browsers":{"Chrome":"\\bCrMo\\b|CriOS|Android.*Chrome\/[.0-9]* (Mobile)?","Dolfin":"\\bDolfin\\b","Opera":"Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\/[0-9.]+|Coast\/[0-9.]+","Skyfire":"Skyfire","IE":"IEMobile|MSIEMobile","Firefox":"fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile","Bolt":"bolt","TeaShark":"teashark","Blazer":"Blazer","Safari":"Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari","Tizen":"Tizen","UCBrowser":"UC.*Browser|UCWEB","baiduboxapp":"baiduboxapp","baidubrowser":"baidubrowser","DiigoBrowser":"DiigoBrowser","Puffin":"Puffin","Mercury":"\\bMercury\\b","ObigoBrowser":"Obigo","NetFront":"NF-Browser","GenericBrowser":"NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger"},"os":{"AndroidOS":"Android","BlackBerryOS":"blackberry|\\bBB10\\b|rim tablet os","PalmOS":"PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino","SymbianOS":"Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\bS60\\b","WindowsMobileOS":"Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;","WindowsPhoneOS":"Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;","iOS":"\\biPhone.*Mobile|\\biPod|\\biPad","MeeGoOS":"MeeGo","MaemoOS":"Maemo","JavaOS":"J2ME\/|\\bMIDP\\b|\\bCLDC\\b","webOS":"webOS|hpwOS","badaOS":"\\bBada\\b","BREWOS":"BREW"},"utilities":{"Bot":"Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom","MobileBot":"Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker\/M1A1-R2D2","DesktopMode":"WPDesktop","TV":"SonyDTV|HbbTV","WebKit":"(webkit)[ \/]([\\w.]+)","Console":"\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\\b","Watch":"SM-V700"}}} \ No newline at end of file diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php b/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php index b6eb0da21b3..fe55d7fedc9 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php +++ b/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php @@ -8,7 +8,9 @@ * Mobile_Detect is a lightweight PHP class for detecting mobile devices (including tablets). * It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment. * - * @author Current authors: Serban Ghita , Nick Ilyin + * @author Current authors: Serban Ghita + * Nick Ilyin + * * Original author: Victor Stanciu * * @license Code and contributions have 'MIT License' @@ -20,7 +22,7 @@ * README: https://github.com/serbanghita/Mobile-Detect/blob/master/README.md * HOWTO: https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples * - * @version 2.8.3 + * @version 2.8.17 */ class Mobile_Detect @@ -64,7 +66,7 @@ class Mobile_Detect /** * Stores the version number of the current release. */ - const VERSION = '2.8.3'; + const VERSION = '2.8.17'; /** * A type for the version() method indicating a string return value. @@ -76,6 +78,12 @@ class Mobile_Detect */ const VERSION_TYPE_FLOAT = 'float'; + /** + * A cache for resolved matches + * @var array + */ + protected $cache = array(); + /** * The User-Agent HTTP header is stored in here. * @var string @@ -88,6 +96,26 @@ class Mobile_Detect */ protected $httpHeaders = array(); + /** + * CloudFront headers. E.g. CloudFront-Is-Desktop-Viewer, CloudFront-Is-Mobile-Viewer & CloudFront-Is-Tablet-Viewer. + * @var array + */ + protected $cloudfrontHeaders = array(); + + /** + * The matching Regex. + * This is good for debug. + * @var string + */ + protected $matchingRegex = null; + + /** + * The matches extracted from the regex expression. + * This is good for debug. + * @var string + */ + protected $matchesArray = null; + /** * The detection type, using self::DETECTION_TYPE_MOBILE or self::DETECTION_TYPE_EXTENDED. * @@ -127,7 +155,7 @@ class Mobile_Detect 'HTTP_UA_OS' => null, // Reported by Verizon, Vodafone proxy system. 'HTTP_X_MOBILE_GATEWAY' => null, - // Seend this on HTC Sensation. @ref: SensationXE_Beats_Z715e. + // Seen this on HTC Sensation. SensationXE_Beats_Z715e. 'HTTP_X_ATT_DEVICEID' => null, // Seen this on a HTC. 'HTTP_UA_CPU' => array('matches' => array('ARM')), @@ -139,33 +167,45 @@ class Mobile_Detect * @var array */ protected static $phoneDevices = array( - 'iPhone' => '\biPhone.*(Mobile|PhoneGap)|\biPod', // |\biTunes + 'iPhone' => '\biPhone\b|\biPod\b', // |\biTunes 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+', 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m', - 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile', + 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6', // @todo: Is 'Dell Streak' a tablet or a phone? ;) 'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b', - 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925', - 'Samsung' => 'Samsung|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E', - 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)', - 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i', + 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\bMoto E\b', + 'Samsung' => 'Samsung|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205', + 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)', + 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533', 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile', - // @ref: http://www.micromaxinfo.com/mobiles/smartphones + // http://www.micromaxinfo.com/mobiles/smartphones // Added because the codes might conflict with Acer Tablets. 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b', - 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; @todo - complete the regex. + // @todo Complete the regex. + 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;) - // @ref: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH) + // http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH) // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android. 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790', - // @ref: http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones. + // http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones. 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250', - 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)', + // http://fr.wikomobile.com + 'Wiko' => 'KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM', + 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)', // Added simvalley mobile just for fun. They have some interesting devices. - // @ref: http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html + // http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b', - // @Tapatalk is a mobile app; @ref: http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039 - 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser' + // Wolfgang - a brand that is sold by Aldi supermarkets. + // http://www.wolfgangmobile.com/ + 'Wolfgang' => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q', + 'Alcatel' => 'Alcatel', + 'Nintendo' => 'Nintendo 3DS', + // http://en.wikipedia.org/wiki/Amoi + 'Amoi' => 'Amoi', + // http://en.wikipedia.org/wiki/INQ + 'INQ' => 'INQ', + // @Tapatalk is a mobile app; http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039 + 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser', ); /** @@ -174,78 +214,94 @@ class Mobile_Detect * @var array */ protected static $tabletDevices = array( - 'iPad' => 'iPad|iPad.*Mobile', // @todo: check for mobile friendly emails topic. - 'NexusTablet' => 'Android.*Nexus[\s]+(7|10)|^.*Android.*Nexus(?:(?!Mobile).)*$', - 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-I9205|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705C|SM-T535|SM-T331', // SCH-P709|SCH-P729|SM-T2558 - Samsung Mega - treat them like a regular phone. - // @reference: http://www.labnol.org/software/kindle-user-agent-string/20378/ - 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE)\b', + // @todo: check for mobile friendly emails topic. + 'iPad' => 'iPad|iPad.*Mobile', + // Removed |^.*Android.*Nexus(?!(?:Mobile).)*$ + // @see #442 + 'NexusTablet' => 'Android.*Nexus[\s]+(7|9|10)', + 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T360', // SCH-P709|SCH-P729|SM-T2558|GT-I9205 - Samsung Mega - treat them like a regular phone. + // http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html + 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI)\b', // Only the Surface tablets with Windows RT are considered mobile. - // @ref: http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx - 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;', - // @ref: http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT - 'HPTablet' => 'HP Slate 7|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8', - // @note: watch out for PadFone, see #132 - 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|TX201LA', + // http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx + 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)', + // http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT + 'HPTablet' => 'HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10', + // Watch out for PadFone, see #132. + // http://www.asus.com/de/Tablets_Mobile/Memo_Pad_Products/ + 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K017 |ME572C|ME103K|ME170C|ME171C|\bME70C\b|ME581C|ME581CL|ME8510C|ME181C', 'BlackBerryTablet' => 'PlayBook|RIM Tablet', - 'HTCtablet' => 'HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200', + 'HTCtablet' => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410', 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617', 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2', - // @ref: http://www.acer.ro/ac/ro/RO/content/drivers - // @ref: http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer) - // @ref: http://us.acer.com/ac/en/US/content/group/tablets - // @note: Can conflict with Micromax and Motorola phones codes. - 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-830)\b|W3-810|\bA3-A10\b', - // @ref: http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/ - // @ref: http://us.toshiba.com/tablets/tablet-finder - // @ref: http://www.toshiba.co.jp/regza/tablet/ + // http://www.acer.ro/ac/ro/RO/content/drivers + // http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer) + // http://us.acer.com/ac/en/US/content/group/tablets + // http://www.acer.de/ac/de/DE/content/models/tablets/ + // Can conflict with Micromax and Motorola phones codes. + 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b|\bA3-A11\b', + // http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/ + // http://us.toshiba.com/tablets/tablet-finder + // http://www.toshiba.co.jp/regza/tablet/ 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO', - // @ref: http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html - // @ref: http://www.lg.com/us/tablets - 'LGTablet' => '\bL-06C|LG-V900|LG-V500|LG-V909|LG-V500|LG-V510|LG-VK810\b', + // http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html + // http://www.lg.com/us/tablets + 'LGTablet' => '\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b', 'FujitsuTablet' => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b', // Prestigio Tablets http://www.prestigio.com/support - 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD', - // @ref: http://support.lenovo.com/en_GB/downloads/default.page?# - 'LenovoTablet' => 'IdeaTab|ThinkPad([ ]+)?Tablet|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A1000|A2107|A2109|A1107|B6000|B8000|B8080-F)', - // @ref: http://www.yarvik.com/en/matrix/tablets/ + 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002', + // http://support.lenovo.com/en_GB/downloads/default.page?# + 'LenovoTablet' => 'Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)', + // http://www.dell.com/support/home/us/en/04/Products/tab_mob/tablets + 'DellTablet' => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7', + // http://www.yarvik.com/en/matrix/tablets/ 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b', 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB', - 'ArnovaTablet' => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT', + 'ArnovaTablet' => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2', // http://www.intenso.de/kategorie_en.php?kategorie=33 // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate - 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab', + 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004', // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/ 'IRUTablet' => 'M702pro', 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b', - // @ref: http://www.e-boda.ro/tablete-pc.html + // http://www.e-boda.ro/tablete-pc.html 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)', - // @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/ + // http://www.allview.ro/produse/droseries/lista-tablete-pc/ 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)', - // @reference: http://wiki.archosfans.com/index.php?title=Main_Page - 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|ARCHOS 101G10|Archos 101 Neon', - // @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product + // http://wiki.archosfans.com/index.php?title=Main_Page + 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b', + // http://www.ainol.com/plugin.php?identifier=ainol&module=product 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark', // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER - // @ref: Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser - // @ref: http://www.sony.jp/support/tablet/ - 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551', - // @ref: db + http://www.cube-tablet.com/buy-products.html + // Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser + // http://www.sony.jp/support/tablet/ + 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31', + // http://www.support.philips.com/support/catalog/worldproducts.jsp?userLanguage=en&userCountry=cn&categoryid=3G_LTE_TABLET_SU_CN_CARE&title=3G%20tablets%20/%20LTE%20range&_dyncharset=UTF-8 + 'PhilipsTablet' => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b', + // db + http://www.cube-tablet.com/buy-products.html 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT', - // @ref: http://www.cobyusa.com/?p=pcat&pcat_id=3001 + // http://www.cobyusa.com/?p=pcat&pcat_id=3001 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010', - // @ref: http://www.match.net.cn/products.asp + // http://www.match.net.cn/products.asp 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733', - // @ref: http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets) - // @ref: http://www.imp3.net/14/show.php?itemid=20454 + // http://www.msi.com/support + // @todo Research the Windows Tablets. + 'MSITablet' => 'MSI \b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\b', + // @todo http://www.kyoceramobile.com/support/drivers/ + // 'KyoceraTablet' => null, + // @todo http://intexuae.com/index.php/category/mobile-devices/tablets-products/ + // 'IntextTablet' => null, + // http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets) + // http://www.imp3.net/14/show.php?itemid=20454 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)', - // @ref: http://www.rock-chips.com/index.php?do=prod&pid=2 + // http://www.rock-chips.com/index.php?do=prod&pid=2 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A', - // @ref: http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/ + // http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/ 'FlyTablet' => 'IQ310|Fly Vision', - // @ref: http://www.bqreaders.com/gb/tablets-prices-sale.html - 'bqTablet' => 'bq.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant)|Maxwell.*Lite|Maxwell.*Plus', - // @ref: http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290 - // @ref: http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets) + // http://www.bqreaders.com/gb/tablets-prices-sale.html + 'bqTablet' => 'Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris E10)|Maxwell.*Lite|Maxwell.*Plus', + // http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290 + // http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets) 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim', // Nec or Medias Tab 'NecTablet' => '\bN-06D|\bN-08D', @@ -253,63 +309,63 @@ class Mobile_Detect 'PantechTablet' => 'Pantech.*P4100', // Broncho Tablets: http://www.broncho.cn/ (hard to find) 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)', - // @ref: http://versusuk.com/support.html + // http://versusuk.com/support.html 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b', - // @ref: http://www.zync.in/index.php/our-products/tablet-phablets + // http://www.zync.in/index.php/our-products/tablet-phablets 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900', - // @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/ + // http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/ 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA', - // @ref: https://www.nabitablet.com/ + // https://www.nabitablet.com/ 'NabiTablet' => 'Android.*\bNabi', 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build', // French Danew Tablets http://www.danew.com/produits-tablette.php 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b', // Texet Tablets and Readers http://www.texet.ru/tablet/ 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE', - // @note: Avoid detecting 'PLAYSTATION 3' as mobile. + // Avoid detecting 'PLAYSTATION 3' as mobile. 'PlaystationTablet' => 'Playstation.*(Portable|Vita)', - // @ref: http://www.trekstor.de/surftabs.html - 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A', - // @ref: http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets + // http://www.trekstor.de/surftabs.html + 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab', + // http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b', - // @ref: http://www.advandigital.com/index.php?link=content-product&jns=JP001 - // @Note: because of the short codenames we have to include whitespaces to reduce the possible conflicts. + // http://www.advandigital.com/index.php?link=content-product&jns=JP001 + // because of the short codenames we have to include whitespaces to reduce the possible conflicts. 'AdvanTablet' => 'Android.* \b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\b ', - // @ref: http://www.danytech.com/category/tablet-pc + // http://www.danytech.com/category/tablet-pc 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1', - // @ref: http://www.galapad.net/product.html + // http://www.galapad.net/product.html 'GalapadTablet' => 'Android.*\bG1\b', - // @ref: http://www.micromaxinfo.com/tablet/funbook + // http://www.micromaxinfo.com/tablet/funbook 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b', // http://www.karbonnmobiles.com/products_tablet.php 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b', - // @ref: http://www.myallfine.com/Products.asp + // http://www.myallfine.com/Products.asp 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide', - // @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr= + // http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr= 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b', - // @ref: http://www.yonesnav.com/products/products.php + // http://www.yonesnav.com/products/products.php 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026', - // @ref: http://www.cjshowroom.com/eproducts.aspx?classcode=004001001 + // http://www.cjshowroom.com/eproducts.aspx?classcode=004001001 // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html) 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503', - // @ref: http://www.gloryunion.cn/products.asp - // @ref: http://www.allwinnertech.com/en/apply/mobile.html - // @ref: http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB) + // http://www.gloryunion.cn/products.asp + // http://www.allwinnertech.com/en/apply/mobile.html + // http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB) // @todo: Softwiner tablets? // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions. 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G - // @ref: http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118 + // http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10', - // @ref: http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/ + // http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/ // @todo: add more tests. 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)', - // @ref: http://hclmetablet.com/India/index.php + // http://hclmetablet.com/India/index.php 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync', - // @ref: http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html + // http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html 'DPSTablet' => 'DPS Dream 9|DPS Dual 7', - // @ref: http://www.visture.com/index.asp + // http://www.visture.com/index.asp 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10', - // @ref: http://www.mijncresta.nl/tablet + // http://www.mijncresta.nl/tablet 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989', // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b', @@ -327,7 +383,7 @@ class Mobile_Detect // @note: no need to add all the tablet codes since they are guided by the first regex. 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab', // Generic Vodafone tablets. - 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10', + 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7', // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb // Aka: http://www.essentielb.fr/ 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2', @@ -335,7 +391,7 @@ class Mobile_Detect 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711', // i-mobile http://product.i-mobilephone.com/Mobile_Device 'iMobileTablet' => 'i-mobile i-note', - // @ref: http://www.tolino.de/de/vergleichen/ + // http://www.tolino.de/de/vergleichen/ 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine', // AudioSonic - a Kmart brand // http://www.kmart.com.au/webapp/wcs/stores/servlet/Search?langId=-1&storeId=10701&catalogId=10001&categoryId=193001&pageSize=72¤tPage=1&searchCategory=193001%2b4294965664&sortBy=p_MaxPrice%7c1 @@ -359,16 +415,48 @@ class Mobile_Detect // http://www1.viewsonic.com/products/computing/tablets/ 'ViewsonicTablet' => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a', // http://www.odys.de/web/internet-tablet_en.html - 'OdysTablet' => 'LOOX|XENO10|ODYS Space', + 'OdysTablet' => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10', // http://www.captiva-power.de/products.html#tablets-en 'CaptivaTablet' => 'CAPTIVA PAD', // IconBIT - http://www.iconbit.com/products/tablets/ 'IconbitTablet' => 'NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S', - // @ref: http://www.tesco.com/direct/hudl/ + // http://www.teclast.com/topic.php?channelID=70&topicID=140&pid=63 + 'TeclastTablet' => 'T98 4G|\bP80\b|\bX90HD\b|X98 Air|X98 Air 3G|\bX89\b|P80 3G|\bX80h\b|P98 Air|\bX89HD\b|P98 3G|\bP90HD\b|P89 3G|X98 3G|\bP70h\b|P79HD 3G|G18d 3G|\bP79HD\b|\bP89s\b|\bA88\b|\bP10HD\b|\bP19HD\b|G18 3G|\bP78HD\b|\bA78\b|\bP75\b|G17s 3G|G17h 3G|\bP85t\b|\bP90\b|\bP11\b|\bP98t\b|\bP98HD\b|\bG18d\b|\bP85s\b|\bP11HD\b|\bP88s\b|\bA80HD\b|\bA80se\b|\bA10h\b|\bP89\b|\bP78s\b|\bG18\b|\bP85\b|\bA70h\b|\bA70\b|\bG17\b|\bP18\b|\bA80s\b|\bA11s\b|\bP88HD\b|\bA80h\b|\bP76s\b|\bP76h\b|\bP98\b|\bA10HD\b|\bP78\b|\bP88\b|\bA11\b|\bA10t\b|\bP76a\b|\bP76t\b|\bP76e\b|\bP85HD\b|\bP85a\b|\bP86\b|\bP75HD\b|\bP76v\b|\bA12\b|\bP75a\b|\bA15\b|\bP76Ti\b|\bP81HD\b|\bA10\b|\bT760VE\b|\bT720HD\b|\bP76\b|\bP73\b|\bP71\b|\bP72\b|\bT720SE\b|\bC520Ti\b|\bT760\b|\bT720VE\b|T720-3GE|T720-WiFi', + // Onda - http://www.onda-tablet.com/buy-android-onda.html?dir=desc&limit=all&order=price + 'OndaTablet' => '\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\b[\s]+', + 'JaytechTablet' => 'TPC-PA762', + 'BlaupunktTablet' => 'Endeavour 800NG|Endeavour 1010', + // http://www.digma.ru/support/download/ + // @todo: Ebooks also (if requested) + 'DigmaTablet' => '\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b', + // http://www.evolioshop.com/ro/tablete-pc.html + // http://www.evolio.ro/support/downloads_static.html?cat=2 + // @todo: Research some more + 'EvolioTablet' => 'ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b', + // @todo http://www.lavamobiles.com/tablets-data-cards + 'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY|\bE-TAB\b', + // https://www.celkonmobiles.com/?_a=categoryphones&sid=2 + 'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b', + // http://www.wolderelectronics.com/productos/manuales-y-guias-rapidas/categoria-2-miTab + 'WolderTablet' => 'miTab \b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\b', + // http://www.mi.com/en + 'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b', + // http://www.nbru.cn/index.html + 'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One', + // http://navroad.com/products/produkty/tablety/ + 'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI', + // http://leader-online.com/new_site/product-category/tablets/ + // http://www.leader-online.net.au/List/Tablet + 'LeaderTablet' => 'TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100', + // http://www.datawind.com/ubislate/ + 'UbislateTablet' => 'UbiSlate[\s]?7C', + // http://www.pocketbook-int.com/ru/support + 'PocketBookTablet' => 'Pocketbook', + // http://www.tesco.com/direct/hudl/ 'Hudl' => 'Hudl HT7S3', - // @ref: http://www.telstra.com.au/home-phone/thub-2/ + // http://www.telstra.com.au/home-phone/thub-2/ 'TelstraTablet' => 'T-Hub2', - 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4', + 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bJolla\b|\bTP750\b' ); /** @@ -386,7 +474,8 @@ class Mobile_Detect // @reference: http://en.wikipedia.org/wiki/Windows_Phone // http://wifeng.cn/?r=blog&a=view&id=106 // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx - 'WindowsPhoneOS' => 'Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7', + // http://msdn.microsoft.com/library/ms537503.aspx + 'WindowsPhoneOS' => 'Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;', 'iOS' => '\biPhone.*Mobile|\biPod|\biPad', // http://en.wikipedia.org/wiki/MeeGo // @todo: research MeeGo in UAs @@ -417,20 +506,26 @@ class Mobile_Detect 'TeaShark' => 'teashark', 'Blazer' => 'Blazer', // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3 - 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile', - // @ref: http://en.wikipedia.org/wiki/Midori_(web_browser) + 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari', + // http://en.wikipedia.org/wiki/Midori_(web_browser) //'Midori' => 'midori', 'Tizen' => 'Tizen', 'UCBrowser' => 'UC.*Browser|UCWEB', - // @ref: https://github.com/serbanghita/Mobile-Detect/issues/7 + 'baiduboxapp' => 'baiduboxapp', + 'baidubrowser' => 'baidubrowser', + // https://github.com/serbanghita/Mobile-Detect/issues/7 'DiigoBrowser' => 'DiigoBrowser', // http://www.puffinbrowser.com/index.php 'Puffin' => 'Puffin', - // @ref: http://mercury-browser.com/index.html + // http://mercury-browser.com/index.html 'Mercury' => '\bMercury\b', + // http://en.wikipedia.org/wiki/Obigo_Browser + 'ObigoBrowser' => 'Obigo', + // http://en.wikipedia.org/wiki/NetFront + 'NetFront' => 'NF-Browser', // @reference: http://en.wikipedia.org/wiki/Minimo // http://en.wikipedia.org/wiki/Vision_Mobile_Browser - 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger' + 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger', ); /** @@ -440,15 +535,16 @@ class Mobile_Detect */ protected static $utilities = array( // Experimental. When a mobile device wants to switch to 'Desktop Mode'. - // @ref: http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/ - // @ref: https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011 + // http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/ + // https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011 + // https://developers.facebook.com/docs/sharing/best-practices + 'Bot' => 'Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom', + 'MobileBot' => 'Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2', 'DesktopMode' => 'WPDesktop', 'TV' => 'SonyDTV|HbbTV', // experimental 'WebKit' => '(webkit)[ /]([\w.]+)', - 'Bot' => 'Googlebot|DoCoMo|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|facebookexternalhit', - 'MobileBot' => 'Googlebot-Mobile|DoCoMo|YahooSeeker/M1A1-R2D2', // @todo: Include JXD consoles. - 'Console' => '\b(Nintendo|Nintendo WiiU|PLAYSTATION|Xbox)\b', + 'Console' => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\b', 'Watch' => 'SM-V700', ); @@ -500,8 +596,9 @@ class Mobile_Detect // @reference: https://developer.mozilla.org/en-US/docs/User_Agent_Strings_Reference 'Firefox' => 'Firefox/[VER]', 'Fennec' => 'Fennec/[VER]', - // @reference: http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx - 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];'), + // http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx + // https://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx + 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];', 'Trident/[0-9.]+;.*rv:[VER]'), // http://en.wikipedia.org/wiki/NetFront 'NetFront' => 'NetFront/[VER]', 'NokiaBrowser' => 'NokiaBrowser/[VER]', @@ -511,6 +608,9 @@ class Mobile_Detect 'UC Browser' => 'UC Browser[VER]', 'MQQBrowser' => 'MQQBrowser/[VER]', 'MicroMessenger' => 'MicroMessenger/[VER]', + 'baiduboxapp' => 'baiduboxapp/[VER]', + 'baidubrowser' => 'baidubrowser/[VER]', + 'Iron' => 'Iron/[VER]', // @note: Safari 7534.48.3 is actually Version 5.1. // @note: On BlackBerry the Version is overwriten by the OS. 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ), @@ -524,7 +624,7 @@ class Mobile_Detect 'Presto' => 'Presto/[VER]', // OS - 'iOS' => ' \bOS\b [VER] ', + 'iOS' => ' \bi?OS\b [VER][ ;]{1}', 'Android' => 'Android [VER]', 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'), 'BREW' => 'BREW [VER]', @@ -543,15 +643,15 @@ class Mobile_Detect /** * Construct an instance of this class. * - * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored. - * If left empty, will use the global _SERVER['HTTP_*'] vars instead. + * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored. + * If left empty, will use the global _SERVER['HTTP_*'] vars instead. * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT * from the $headers array instead. */ public function __construct( array $headers = null, $userAgent = null - ){ + ) { $this->setHttpHeaders($headers); $this->setUserAgent($userAgent); } @@ -577,21 +677,24 @@ class Mobile_Detect */ public function setHttpHeaders($httpHeaders = null) { - //use global _SERVER if $httpHeaders aren't defined + // use global _SERVER if $httpHeaders aren't defined if (!is_array($httpHeaders) || !count($httpHeaders)) { $httpHeaders = $_SERVER; } - //clear existing headers + // clear existing headers $this->httpHeaders = array(); - //Only save HTTP headers. In PHP land, that means only _SERVER vars that - //start with HTTP_. + // Only save HTTP headers. In PHP land, that means only _SERVER vars that + // start with HTTP_. foreach ($httpHeaders as $key => $value) { - if (substr($key,0,5) == 'HTTP_') { + if (substr($key, 0, 5) === 'HTTP_') { $this->httpHeaders[$key] = $value; } } + + // In case we're dealing with CloudFront, we need to know. + $this->setCfHeaders($httpHeaders); } /** @@ -616,13 +719,13 @@ class Mobile_Detect */ public function getHttpHeader($header) { - //are we using PHP-flavored headers? + // are we using PHP-flavored headers? if (strpos($header, '_') === false) { $header = str_replace('-', '_', $header); $header = strtoupper($header); } - //test the alternate, too + // test the alternate, too $altHeader = 'HTTP_' . $header; //Test both the regular and the HTTP_ prefix @@ -651,6 +754,47 @@ class Mobile_Detect return self::$uaHttpHeaders; } + + /** + * Set CloudFront headers + * http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-device + * + * @param array $cfHeaders List of HTTP headers + * + * @return boolean If there were CloudFront headers to be set + */ + public function setCfHeaders($cfHeaders = null) { + // use global _SERVER if $cfHeaders aren't defined + if (!is_array($cfHeaders) || !count($cfHeaders)) { + $cfHeaders = $_SERVER; + } + + // clear existing headers + $this->cloudfrontHeaders = array(); + + // Only save CLOUDFRONT headers. In PHP land, that means only _SERVER vars that + // start with cloudfront-. + $response = false; + foreach ($cfHeaders as $key => $value) { + if (substr(strtolower($key), 0, 16) === 'http_cloudfront_') { + $this->cloudfrontHeaders[strtoupper($key)] = $value; + $response = true; + } + } + + return $response; + } + + /** + * Retrieves the cloudfront headers. + * + * @return array + */ + public function getCfHeaders() + { + return $this->cloudfrontHeaders; + } + /** * Set the User-Agent to be used. * @@ -660,21 +804,28 @@ class Mobile_Detect */ public function setUserAgent($userAgent = null) { - if (!empty($userAgent)) { + // Invalidate cache due to #375 + $this->cache = array(); + + if (false === empty($userAgent)) { return $this->userAgent = $userAgent; } else { - $this->userAgent = null; - - foreach($this->getUaHttpHeaders() as $altHeader){ - if(!empty($this->httpHeaders[$altHeader])){ // @todo: should use getHttpHeader(), but it would be slow. (Serban) + foreach ($this->getUaHttpHeaders() as $altHeader) { + if (false === empty($this->httpHeaders[$altHeader])) { // @todo: should use getHttpHeader(), but it would be slow. (Serban) $this->userAgent .= $this->httpHeaders[$altHeader] . " "; } } - return $this->userAgent = (!empty($this->userAgent) ? trim($this->userAgent) : null); - + if (!empty($this->userAgent)) { + return $this->userAgent = trim($this->userAgent); + } } + + if (count($this->getCfHeaders()) > 0) { + return $this->userAgent = 'Amazon CloudFront'; + } + return $this->userAgent = null; } /** @@ -702,13 +853,23 @@ class Mobile_Detect $type = self::DETECTION_TYPE_MOBILE; } - if ($type != self::DETECTION_TYPE_MOBILE && $type != self::DETECTION_TYPE_EXTENDED) { + if ($type !== self::DETECTION_TYPE_MOBILE && $type !== self::DETECTION_TYPE_EXTENDED) { return; } $this->detectionType = $type; } + public function getMatchingRegex() + { + return $this->matchingRegex; + } + + public function getMatchesArray() + { + return $this->matchesArray; + } + /** * Retrieve the list of known phone devices. * @@ -847,14 +1008,15 @@ class Mobile_Detect public function checkHttpHeadersForMobile() { - foreach($this->getMobileHeaders() as $mobileHeader => $matchType){ - if( isset($this->httpHeaders[$mobileHeader]) ){ - if( is_array($matchType['matches']) ){ - foreach($matchType['matches'] as $_match){ - if( strpos($this->httpHeaders[$mobileHeader], $_match) !== false ){ + foreach ($this->getMobileHeaders() as $mobileHeader => $matchType) { + if (isset($this->httpHeaders[$mobileHeader])) { + if (is_array($matchType['matches'])) { + foreach ($matchType['matches'] as $_match) { + if (strpos($this->httpHeaders[$mobileHeader], $_match) !== false) { return true; } } + return false; } else { return true; @@ -877,8 +1039,8 @@ class Mobile_Detect */ public function __call($name, $arguments) { - //make sure the name starts with 'is', otherwise - if (substr($name, 0, 2) != 'is') { + // make sure the name starts with 'is', otherwise + if (substr($name, 0, 2) !== 'is') { throw new BadMethodCallException("No such method exists: $name"); } @@ -892,7 +1054,7 @@ class Mobile_Detect /** * Find a detection rule that matches the current User-agent. * - * @param null $userAgent deprecated + * @param null $userAgent deprecated * @return boolean */ protected function matchDetectionRulesAgainstUA($userAgent = null) @@ -902,6 +1064,7 @@ class Mobile_Detect if (empty($_regex)) { continue; } + if ($this->match($_regex, $userAgent)) { return true; } @@ -913,36 +1076,38 @@ class Mobile_Detect /** * Search for a certain key in the rules array. * If the key is found the try to match the corresponding - * regex agains the User-Agent. + * regex against the User-Agent. * * @param string $key - * @param null $userAgent deprecated - * @return mixed + * + * @return boolean */ - protected function matchUAAgainstKey($key, $userAgent = null) + protected function matchUAAgainstKey($key) { // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc. $key = strtolower($key); + if (false === isset($this->cache[$key])) { - //change the keys to lower case - $_rules = array_change_key_case($this->getRules()); + // change the keys to lower case + $_rules = array_change_key_case($this->getRules()); - if (array_key_exists($key, $_rules)) { - if (empty($_rules[$key])) { - return null; + if (false === empty($_rules[$key])) { + $this->cache[$key] = $this->match($_rules[$key]); } - return $this->match($_rules[$key], $userAgent); + if (false === isset($this->cache[$key])) { + $this->cache[$key] = false; + } } - return false; + return $this->cache[$key]; } /** * Check if the device is mobile. * Returns true if any type of mobile device detected, including special ones - * @param null $userAgent deprecated - * @param null $httpHeaders deprecated + * @param null $userAgent deprecated + * @param null $httpHeaders deprecated * @return bool */ public function isMobile($userAgent = null, $httpHeaders = null) @@ -956,6 +1121,14 @@ class Mobile_Detect $this->setUserAgent($userAgent); } + // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront' + if ($this->getUserAgent() === 'Amazon CloudFront') { + $cfHeaders = $this->getCfHeaders(); + if(array_key_exists('HTTP_CLOUDFRONT_IS_MOBILE_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_MOBILE_VIEWER'] === 'true') { + return true; + } + } + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); if ($this->checkHttpHeadersForMobile()) { @@ -976,6 +1149,14 @@ class Mobile_Detect */ public function isTablet($userAgent = null, $httpHeaders = null) { + // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront' + if ($this->getUserAgent() === 'Amazon CloudFront') { + $cfHeaders = $this->getCfHeaders(); + if(array_key_exists('HTTP_CLOUDFRONT_IS_TABLET_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_TABLET_VIEWER'] === 'true') { + return true; + } + } + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); foreach (self::$tabletDevices as $_regex) { @@ -992,9 +1173,9 @@ class Mobile_Detect * userAgent. * @todo: The httpHeaders part is not yet used. * - * @param string $key - * @param string $userAgent deprecated - * @param string $httpHeaders deprecated + * @param string $key + * @param string $userAgent deprecated + * @param string $httpHeaders deprecated * @return bool|int|null */ public function is($key, $userAgent = null, $httpHeaders = null) @@ -1030,10 +1211,14 @@ class Mobile_Detect */ public function match($regex, $userAgent = null) { - // Escape the special character which is the delimiter. - $regex = str_replace('/', '\/', $regex); + $match = (bool) preg_match(sprintf('#%s#is', $regex), (false === empty($userAgent) ? $userAgent : $this->userAgent), $matches); + // If positive match is found, store the results for debug. + if ($match) { + $this->matchingRegex = $regex; + $this->matchesArray = $matches; + } - return (bool) preg_match('/'.$regex.'/is', (!empty($userAgent) ? $userAgent : $this->userAgent)); + return $match; } /** @@ -1072,11 +1257,11 @@ class Mobile_Detect * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31) * * @param string $propertyName The name of the property. See self::getProperties() array - * keys for all possible properties. - * @param string $type Either self::VERSION_TYPE_STRING to get a string value or - * self::VERSION_TYPE_FLOAT indicating a float value. This parameter - * is optional and defaults to self::VERSION_TYPE_STRING. Passing an - * invalid parameter will default to the this type as well. + * keys for all possible properties. + * @param string $type Either self::VERSION_TYPE_STRING to get a string value or + * self::VERSION_TYPE_FLOAT indicating a float value. This parameter + * is optional and defaults to self::VERSION_TYPE_STRING. Passing an + * invalid parameter will default to the this type as well. * * @return string|float The version of the property we are trying to extract. */ @@ -1086,15 +1271,15 @@ class Mobile_Detect return false; } - //set the $type to the default if we don't recognize the type - if ($type != self::VERSION_TYPE_STRING && $type != self::VERSION_TYPE_FLOAT) { + // set the $type to the default if we don't recognize the type + if ($type !== self::VERSION_TYPE_STRING && $type !== self::VERSION_TYPE_FLOAT) { $type = self::VERSION_TYPE_STRING; } $properties = self::getProperties(); // Check if the property exists in the properties array. - if (array_key_exists($propertyName, $properties)) { + if (true === isset($properties[$propertyName])) { // Prepare the pattern to be matched. // Make sure we always deal with an array (string is converted). @@ -1104,14 +1289,11 @@ class Mobile_Detect $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString); - // Escape the special character which is the delimiter. - $propertyPattern = str_replace('/', '\/', $propertyPattern); - // Identify and extract the version. - preg_match('/'.$propertyPattern.'/is', $this->userAgent, $match); + preg_match(sprintf('#%s#is', $propertyPattern), $this->userAgent, $match); - if (!empty($match[1])) { - $version = ( $type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1] ); + if (false === empty($match[1])) { + $version = ($type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1]); return $version; } @@ -1133,10 +1315,10 @@ class Mobile_Detect $isMobile = $this->isMobile(); if ( - // Apple iOS 3.2-5.1 - Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3), iPad 3 (5.1), original iPhone (3.1), iPhone 3 (3.2), 3GS (4.3), 4 (4.3 / 5.0), and 4S (5.1) - $this->isIOS() && $this->version('iPad', self::VERSION_TYPE_FLOAT)>=4.3 || - $this->isIOS() && $this->version('iPhone', self::VERSION_TYPE_FLOAT)>=3.1 || - $this->isIOS() && $this->version('iPod', self::VERSION_TYPE_FLOAT)>=3.1 || + // Apple iOS 4-7.0 – Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3 / 5.1 / 6.1), iPad 3 (5.1 / 6.0), iPad Mini (6.1), iPad Retina (7.0), iPhone 3GS (4.3), iPhone 4 (4.3 / 5.1), iPhone 4S (5.1 / 6.0), iPhone 5 (6.0), and iPhone 5S (7.0) + $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) >= 4.3 || + $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) >= 4.3 || + $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) >= 4.3 || // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5) // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM @@ -1144,31 +1326,30 @@ class Mobile_Detect // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7 ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) || - // Windows Phone 7-7.5 - Tested on the HTC Surround (7.0) HTC Trophy (7.5), LG-E900 (7.5), Nokia Lumia 800 - $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT)>=7.0 || + // Windows Phone 7.5-8 - Tested on the HTC Surround (7.5), HTC Trophy (7.5), LG-E900 (7.5), Nokia 800 (7.8), HTC Mazaa (7.8), Nokia Lumia 520 (8), Nokia Lumia 920 (8), HTC 8x (8) + $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT) >= 7.5 || - // Blackberry 7 - Tested on BlackBerry Torch 9810 - // Blackberry 6.0 - Tested on the Torch 9800 and Style 9670 - $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=6.0 || + // Tested on the Torch 9800 (6) and Style 9670 (6), BlackBerry® Torch 9810 (7), BlackBerry Z10 (10) + $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 6.0 || // Blackberry Playbook (1.0-2.0) - Tested on PlayBook $this->match('Playbook.*Tablet') || - // Palm WebOS (1.4-2.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0) - ( $this->version('webOS', self::VERSION_TYPE_FLOAT)>=1.4 && $this->match('Palm|Pre|Pixi') ) || + // Palm WebOS (1.4-3.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0), HP TouchPad (3.0) + ( $this->version('webOS', self::VERSION_TYPE_FLOAT) >= 1.4 && $this->match('Palm|Pre|Pixi') ) || // Palm WebOS 3.0 - Tested on HP TouchPad $this->match('hp.*TouchPad') || - // Firefox Mobile (12 Beta) - Tested on Android 2.3 device - ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=12 ) || + // Firefox Mobile 18 - Tested on Android 2.3 and 4.1 devices + ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 18 ) || // Chrome for Android - Tested on Android 4.0, 4.1 device - ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=4.0 ) || + ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 4.0 ) || // Skyfire 4.1 - Tested on Android 2.3 device - ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT)>=4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) || + ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT) >= 4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) || // Opera Mobile 11.5-12: Tested on Android 2.3 - ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>11 && $this->is('AndroidOS') ) || + ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11.5 && $this->is('AndroidOS') ) || // Meego 1.2 - Tested on Nokia 950 and N9 $this->is('MeeGoOS') || @@ -1178,71 +1359,76 @@ class Mobile_Detect // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser // @todo: more tests here! - $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT)>=2.0 || + $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT) >= 2.0 || // UC Browser - Tested on Android 2.3 device - ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) || + ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) || // Kindle 3 and Fire - Tested on the built-in WebKit browser for each ( $this->match('Kindle Fire') || - $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT)>=3.0 ) || + $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT) >= 3.0 ) || // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet $this->is('AndroidOS') && $this->is('NookTablet') || - // Chrome Desktop 11-21 - Tested on OS X 10.7 and Windows 7 - $this->version('Chrome', self::VERSION_TYPE_FLOAT)>=11 && !$isMobile || + // Chrome Desktop 16-24 - Tested on OS X 10.7 and Windows 7 + $this->version('Chrome', self::VERSION_TYPE_FLOAT) >= 16 && !$isMobile || - // Safari Desktop 4-5 - Tested on OS X 10.7 and Windows 7 - $this->version('Safari', self::VERSION_TYPE_FLOAT)>=5.0 && !$isMobile || + // Safari Desktop 5-6 - Tested on OS X 10.7 and Windows 7 + $this->version('Safari', self::VERSION_TYPE_FLOAT) >= 5.0 && !$isMobile || - // Firefox Desktop 4-13 - Tested on OS X 10.7 and Windows 7 - $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=4.0 && !$isMobile || + // Firefox Desktop 10-18 - Tested on OS X 10.7 and Windows 7 + $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 10.0 && !$isMobile || // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7 - $this->version('MSIE', self::VERSION_TYPE_FLOAT)>=7.0 && !$isMobile || + $this->version('IE', self::VERSION_TYPE_FLOAT) >= 7.0 && !$isMobile || // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7 - // @reference: http://my.opera.com/community/openweb/idopera/ - $this->version('Opera', self::VERSION_TYPE_FLOAT)>=10 && !$isMobile - + $this->version('Opera', self::VERSION_TYPE_FLOAT) >= 10 && !$isMobile ){ return self::MOBILE_GRADE_A; } if ( - $this->isIOS() && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 || - $this->isIOS() && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<3.1 || - $this->isIOS() && $this->version('iPod', self::VERSION_TYPE_FLOAT)<3.1 || + $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 || + $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<4.3 || + $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT)<4.3 || // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770 - $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 || + $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 || //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3 - ( $this->version('Opera Mini', self::VERSION_TYPE_FLOAT)>=5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT)<=6.5 && - ($this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 || $this->is('iOS')) ) || + ($this->version('Opera Mini', self::VERSION_TYPE_FLOAT) >= 5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT) <= 7.0 && + ($this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 || $this->is('iOS')) ) || // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1) $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') || // @todo: report this (tested on Nokia N71) - $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>=11 && $this->is('SymbianOS') + $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11 && $this->is('SymbianOS') ){ return self::MOBILE_GRADE_B; } if ( // Blackberry 4.x - Tested on the Curve 8330 - $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<5.0 || + $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) <= 5.0 || // Windows Mobile - Tested on the HTC Leo (WinMo 5.2) - $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT)<=5.2 + $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT) <= 5.2 || + // Tested on original iPhone (3.1), iPhone 3 (3.2) + $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) <= 3.2 || + $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) <= 3.2 || + $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) <= 3.2 || + + // Internet Explorer 7 and older - Tested on Windows XP + $this->version('IE', self::VERSION_TYPE_FLOAT) <= 7.0 && !$isMobile ){ return self::MOBILE_GRADE_C; } - //All older smartphone platforms and featurephones - Any device that doesn't support media queries - //will receive the basic, C grade experience. + // All older smartphone platforms and featurephones - Any device that doesn't support media queries + // will receive the basic, C grade experience. return self::MOBILE_GRADE_C; } } diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/README.md b/htdocs/includes/mobiledetect/mobiledetectlib/README.md index acc861a1927..d96db2dea3d 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/README.md +++ b/htdocs/includes/mobiledetect/mobiledetectlib/README.md @@ -1,38 +1,66 @@ - +[![Build Status](https://travis-ci.org/serbanghita/Mobile-Detect.svg?branch=devel)](https://travis-ci.org/serbanghita/Mobile-Detect) [![Latest Stable Version](https://poser.pugx.org/mobiledetect/mobiledetectlib/v/stable.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) [![Total Downloads](https://poser.pugx.org/mobiledetect/mobiledetectlib/downloads.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) [![Daily Downloads](https://poser.pugx.org/mobiledetect/mobiledetectlib/d/daily.png)](https://packagist.org/packages/mobiledetect/mobiledetectlib) [![License](https://poser.pugx.org/mobiledetect/mobiledetectlib/license.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) +[![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/serbanghita/Mobile-Detect?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) + +![Mobile Detect](http://demo.mobiledetect.net/logo-github.png) > Motto: "Every business should have a mobile detection script to detect mobile readers." -Mobile_Detect is a lightweight PHP class for detecting mobile devices (including tablets). -It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment. +*Mobile_Detect is a lightweight PHP class for detecting mobile devices (including tablets). +It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.* -Nowadays web site/app content strategy matters, this is why you need all the tools to deliver the best and the fastest experience for the small screens. Mobile_Detect class is a [server-side detection](http://www.w3.org/TR/mwabp/#bp-devcap-detection) tool, it is not a replacement for Responsive Web Design (media queries) or other forms of client-side feature detection. +We're committed to make Mobile_Detect the best open-source mobile detection resource and this is why before +each release we're running [unit tests](./tests), we also research and update the detection rules on **daily** +and **weekly** basis. -We're commited to make Mobile_Detect the best open-source mobile detection resource and this is why before each release we're running [unit tests](./tests), we also research and update the detection rules on daily and weekly basis. +Your website's _content strategy_ is important! You need a complete toolkit to deliver an experience that is _optimized_, _fast_ and _relevant_ to your users. Mobile_Detect class is a [server-side detection](http://www.w3.org/TR/mwabp/#bp-devcap-detection) tool that can help you with your RWD strategy, it is not a replacement for CSS3 media queries or other forms of client-side feature detection. -

      -
      -Thanks ImpressPages CMS for showing us some love!

      +##### This month updates +**THANK YOU** for your continuous support and feedback! +Still working on `3.0.0` branch to provide you with device detection! We're really excited on this one! +We would like to speed this up, but life and family gets in the way ;) + +Special thanks to **JetBrains** for providing licenses for **PHPStorm**. In case you never heard or tried PHPStorm, you're +clearly missing out! [Check PHPStorm](https://www.jetbrains.com/phpstorm/) out! ##### Download and demo -Latest releases, Latest dev branch, composer package +|Download|Docs|Examples| +|-------------|-------------|-------------| +|[Go to releases](../../tags)|[Become a contributor](../../wiki/Become-a-contributor)|[Code examples](../../wiki/Code-examples) +|[Mobile_Detect.php](./Mobile_Detect.php)|[History](../../wiki/History)|[:iphone: Live demo!](http://is.gd/mobiletest) +|[Composer package](https://packagist.org/packages/mobiledetect/mobiledetectlib)| -See also: :bulb: Become a contributor / :coffee: History / :point_right: Code examples / -:iphone: Live demo! (point your device browser to this URL) +#### Continuous updates + +You can use [composer](https://getcomposer.org/doc/00-intro.md) in your release and update process to make sure you have the latest Mobile_Detect version. + +``` +composer require mobiledetect/mobiledetectlib +``` + +```json +{ + "require": { + "mobiledetect/mobiledetectlib": "^2.8" + } +} +``` ##### Help -Click here to lend your support to: Research and development of Mobile Detect library! - +|Pledgie|Paypal| +|-------|------| +|[Donate :+1:](http://pledgie.com/campaigns/21856)|[Donate :beer:](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=mobiledetectlib%40gmail%2ecom&lc=US&item_name=Mobile%20Detect¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted)| -I'm currently paying for hosting and spend a lot of my family time :family: to maintain the project and planning the future releases. + +I'm currently paying for hosting and spend a lot of my family time to maintain the project and planning the future releases. I would highly appreciate any money donations that will keep the research going. Special thanks to the community :+1: for donations, [BrowserStack](http://browserstack.com) - for providing access to their great platform, [Zend](http://zend.com) - for donating licenses, [Dragos Gavrila](https://twitter.com/grafician) who contributed with the logo. -##### 3rd party modules / [Submit new](https://github.com/serbanghita/Mobile-Detect/issues/new?title=New%203rd%20party%20module&body=Name, Link and Description of the module.) +##### 3rd party modules / [Submit new](../../issues/new?title=New%203rd%20party%20module&body=Name, Link and Description of the module.) :point_right: Keep `Mobile_Detect.php` class in a separate `module` and do NOT include it in your script core because of the high frequency of updates. :point_right: When including the class into you `web application` or `module` always use `include_once '../path/to/Mobile_Detect.php` to prevent conflicts. @@ -40,20 +68,23 @@ Special thanks to the community :+1: for donations, [BrowserStack](http://browse - - + + @@ -63,16 +94,23 @@ Special thanks to the community :+1: for donations, [BrowserStack](http://browse

      Drupal Mobile Switch - The Mobile Switch Drupal module provides a automatic theme switch functionality for mobile devices, detected by Browscap or Mobile Detect. Made by Siegfried Neumann.

      -

      Drupal Context Mobile Detect - This is a Drupal context module which integrates Context and PHP Mobile Detect library. +

      Drupal Context Mobile Detect - This is a Drupal context module which integrates Context and PHP Mobile Detect library. Created by Artem Shymko.

      -

      Drupal Mobile Detect - Lightweight mobile detect module for Drupal created by Matthew Donadio

      +

      Drupal Mobile Detect - Lightweight mobile detect module for Drupal created by Matthew Donadio

      - + @@ -91,7 +129,7 @@ Special thanks to the community :+1: for donations, [BrowserStack](http://browse @@ -107,7 +145,7 @@ Special thanks to the community :+1: for donations, [BrowserStack](http://browse @@ -118,7 +156,13 @@ Special thanks to the community :+1: for donations, [BrowserStack](http://browse - + @@ -139,7 +183,12 @@ It overrides the Fuelphp Agent class its methods. Made by Statamic CMS Mobile Detect - plugin. Made by Sergei Filippov of Haiku Lab.

      + + + + + + @@ -147,14 +196,29 @@ It overrides the Fuelphp Agent class its methods. Made by JavaScript port of Mobile-Detect class. Made by Heinrich Goebl

      + + + + + + + + + + - + + + + + + diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/composer.json b/htdocs/includes/mobiledetect/mobiledetectlib/composer.json index 0131e4937ec..c56611fb6b7 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/composer.json +++ b/htdocs/includes/mobiledetect/mobiledetectlib/composer.json @@ -17,7 +17,9 @@ "php": ">=5.0.0" }, "require-dev": { - "phpunit/phpunit": "*" + "phpunit/phpunit": "*", + "johnkary/phpunit-speedtrap": "~1.0@dev", + "codeclimate/php-test-reporter": "dev-master" }, "autoload": { "classmap": ["Mobile_Detect.php"], diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/composer.lock b/htdocs/includes/mobiledetect/mobiledetectlib/composer.lock deleted file mode 100644 index 2b214625190..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/composer.lock +++ /dev/null @@ -1,439 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" - ], - "hash": "5b2d87ea9e6c115194bd355b7b697cec", - "packages": [ - - ], - "packages-dev": [ - { - "name": "phpunit/php-code-coverage", - "version": "1.2.12", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "1.2.12" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/1.2.12", - "reference": "1.2.12", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "phpunit/php-file-iterator": ">=1.3.0@stable", - "phpunit/php-text-template": ">=1.1.1@stable", - "phpunit/php-token-stream": ">=1.1.3@stable" - }, - "require-dev": { - "phpunit/phpunit": "3.7.*@dev" - }, - "suggest": { - "ext-dom": "*", - "ext-xdebug": ">=2.0.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "PHP/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2013-07-06 06:26:16" - }, - { - "name": "phpunit/php-file-iterator", - "version": "1.3.3", - "source": { - "type": "git", - "url": "git://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "1.3.3" - }, - "dist": { - "type": "zip", - "url": "https://github.com/sebastianbergmann/php-file-iterator/zipball/1.3.3", - "reference": "1.3.3", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "File/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "http://www.phpunit.de/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2012-10-11 04:44:38" - }, - { - "name": "phpunit/php-text-template", - "version": "1.1.4", - "source": { - "type": "git", - "url": "git://github.com/sebastianbergmann/php-text-template.git", - "reference": "1.1.4" - }, - "dist": { - "type": "zip", - "url": "https://github.com/sebastianbergmann/php-text-template/zipball/1.1.4", - "reference": "1.1.4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "Text/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2012-10-31 11:15:28" - }, - { - "name": "phpunit/php-timer", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "1.0.5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1.0.5", - "reference": "1.0.5", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "PHP/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2013-08-02 07:42:54" - }, - { - "name": "phpunit/php-token-stream", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "1.2.0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1.2.0", - "reference": "1.2.0", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } - }, - "autoload": { - "classmap": [ - "PHP/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2013-08-04 05:57:48" - }, - { - "name": "phpunit/phpunit", - "version": "3.7.23", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3.7.23" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3.7.23", - "reference": "3.7.23", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=5.3.3", - "phpunit/php-code-coverage": "~1.2.1", - "phpunit/php-file-iterator": ">=1.3.1", - "phpunit/php-text-template": ">=1.1.1", - "phpunit/php-timer": ">=1.0.4", - "phpunit/phpunit-mock-objects": "~1.2.0", - "symfony/yaml": "~2.0" - }, - "require-dev": { - "pear-pear/pear": "1.9.4" - }, - "suggest": { - "ext-json": "*", - "ext-simplexml": "*", - "ext-tokenizer": "*", - "phpunit/php-invoker": ">=1.1.0,<1.2.0" - }, - "bin": [ - "composer/bin/phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.7.x-dev" - } - }, - "autoload": { - "classmap": [ - "PHPUnit/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "", - "../../symfony/yaml/" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "http://www.phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2013-08-02 19:14:44" - }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "1.2.3", - "source": { - "type": "git", - "url": "git://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "1.2.3" - }, - "dist": { - "type": "zip", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects/archive/1.2.3.zip", - "reference": "1.2.3", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "phpunit/php-text-template": ">=1.1.1@stable" - }, - "suggest": { - "ext-soap": "*" - }, - "type": "library", - "autoload": { - "classmap": [ - "PHPUnit/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], - "time": "2013-01-13 10:24:48" - }, - { - "name": "symfony/yaml", - "version": "v2.3.2", - "target-dir": "Symfony/Component/Yaml", - "source": { - "type": "git", - "url": "https://github.com/symfony/Yaml.git", - "reference": "v2.3.2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/v2.3.2", - "reference": "v2.3.2", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Yaml\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "http://symfony.com", - "time": "2013-07-11 19:36:36" - } - ], - "aliases": [ - - ], - "minimum-stability": "stable", - "stability-flags": [ - - ], - "platform": { - "php": ">=5.0.0" - }, - "platform-dev": [ - - ] -} diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/examples/demo.php b/htdocs/includes/mobiledetect/mobiledetectlib/examples/demo.php index 82fec6cdb3e..38dad6b2879 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/examples/demo.php +++ b/htdocs/includes/mobiledetect/mobiledetectlib/examples/demo.php @@ -34,6 +34,7 @@ require_once '../Mobile_Detect.php'; $detect = new Mobile_Detect; + $deviceType = ($detect->isMobile() ? ($detect->isTablet() ? 'tablet' : 'phone') : 'computer'); $scriptVersion = $detect->getScriptVersion(); @@ -157,7 +158,7 @@ $scriptVersion = $detect->getScriptVersion();

      This is a . Your UA is

      Please help us improve the mobile detection by choosing the correct answer.
      - Before sending an answer double check if you are using the browser in 'Desktop mode'.
      + Before sending an answer double check that you are using the browser in its normal mode, not in 'Desktop mode'.
      You can contribute by:
      1. forking the project
      2. submiting an issue
      @@ -250,6 +251,19 @@ $scriptVersion = $detect->getScriptVersion();

      + + + + + + + + + + + + +
      Varnish Cache

      Varnish Mobile Detect - Drop-in varnish solution to mobile user detection based on the Mobile-Detect library. Made by willemk

      Varnish Cache +

      Varnish Mobile Detect - Drop-in varnish solution to mobile user detection based on the Mobile-Detect library. Made by willemk

      +

      mobiledetect2vcl - Python script to transform the Mobile Detect JSON database into an UA-based mobile detection VCL subroutine easily integrable in any Varnish Cache configuration. Made by Carlos Abalde

      +
      WordPress -

      WordPress Mobile Detect - Gives you the ability to wrap that infographic in a [notdevice][/notdevice] shortcode so at the server level WordPress will decide to show that content only if the user is NOT on a phone or tablet. Made by Jesse Friedman.

      +

      WordPress Mobile Detect - Gives you the ability to wrap that infographic in a [notdevice][/notdevice] shortcode so at the server level WordPress will decide to show that content only if the user is NOT on a phone or tablet. Made by Jesse Friedman.

      mobble - provides mobile related conditional functions for your site. e.g. is_iphone(), is_mobile() and is_tablet(). Made by Scott Evans.

      WordPress Responsage - A small WordPress theme plugin that allows you to make your images responsive. Made by Adrian Ciaschetti.

      - -

      Social PopUP - This plugin will display a popup or splash screen when a new user visit your site showing a Google+, Twitter and Facebook follow links. It uses Mobile_Detect to detect mobile devices.

      + +

      WP247 Body Classes - Add unique classes to the body tag for easy styling based on various attributes (archive, user, post, mobile) and various WordPress "is" functions. Mobile attributes include type of device, Operating System, Browser, etc. Examples: .is-mobile, .is-not-mobile, .is-tablet, .is-ios, .is-not-ios, .is-androidos, .is-chromebrowser. Made by wescleveland56

      Joomla

      yagendoo Joomla! Mobile Detection Plugin - Lightweight PHP plugin for Joomla! that detects a mobile browser using the Mobile Detect class. Made by yagendoo media.

      +

      yagendoo Joomla! Mobile Detection Plugin - Lightweight PHP plugin for Joomla! + that detects a mobile browser using the Mobile Detect class. Made by yagendoo media.

      + +

      User Agent Detector plugin by @ReneKreijveld. This system plugin detects the user agent of your + website visitor and sets a session variable accordingly. Based on the user agent, the plugin detects if the site is running on a desktop pc, tablet or smartphone. + It can also detect if the visitor is a spider bot (search engine). Session variable that is set: ualayout. Possible values: desktop, tablet, mobile, bot..

      +

      ZF2 Mobile-Detect - Zend Framework 2 module that provides Mobile-Detect features (Mobile_Detect class as a service, helper for views and plugin controllers). Made by neilime

      -

      ZF2 MobileDetectModule - Facilitates integration of a PHP MobileDetect class with some ZF2-based application. Has similar idea like the existing ZF2 Mobile-Detect module, but differs in initialization and provision routine of the actual Mobile_Detect class. Appropriate view helper and controller plugin also have different conceptions. Made by Nikola Posa

      +

      ZF2 MobileDetectModule - Facilitates integration of a PHP MobileDetect class with some ZF2-based application. Has similar idea like the existing ZF2 Mobile-Detect module, but differs in initialization and provision routine of the actual Mobile_Detect class. Appropriate view helper and controller plugin also have different conceptions. Made by Nikola Posa

      Laravel

      Laravel-Agent a user agent class for Laravel, based on Mobile Detect with some additional functionality. Made by Jens Segers.

      -

      BrowserDetectis a browser & mobile detection package, collects and wrap together the best user-agent identifiers for Laravel. Created by Varga Zsolt.

      +

      BrowserDetect is a browser & mobile detection package, collects and wrap together the best user-agent identifiers for Laravel. Created by Varga Zsolt.

      Yii Framework

      Yii Extension - Mobile detect plugin for Yii framework. Made by Alexey Salnikov.

      +

      Yii Extension - Mobile detect plugin for Yii framework. + Made by Alexey Salnikov.

      + +

      Yii2 Device Detect - Yii2 extension for Mobile-Detect library. Made by Alexander Nestorov

      + +

      Statamic CMS Mobile Detect - plugin. Made by Sergei Filippov of Haiku Lab.

      Kohana

      Kohana Mobile Detect - an example of implementation of Mobile_Detect class with Kohana framework. Written by Luiz Alberto S. Ribeiro.

      Perl

      MobileDetect.pm - Perl module for Mobile Detect. Made by Sebastian Enger.

      python

      pymobiledetect - Mobile detect python package. Made by Bas van Oostveen.

      Ruby

      mobile_detect.rb - A Ruby gem using the JSON data exposed by the php project and implementing a basic subset of the API (as much as can be done by the exposed data). Made by Karthik T.

      GoMobileDetect

      GoMobileDetect - Go port of Mobile Detect class. Made by Shaked.

      GoMobileDetect - Go port of Mobile Detect class. Made by Shaked.

      LUA

      ua-lua is a small lib written in LUA providing device type detection. ua-lua is detecting mobile or tablet devices based on user-agent inside nginx daemon. Made by Frédéric Robinet.

      isWhateverYouWant()); ?>
      Debug
      Matching RegexgetMatchingRegex()); ?>
      Matching ArraygetMatchesArray()); ?>
      diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/examples/test.php b/htdocs/includes/mobiledetect/mobiledetectlib/examples/test.php new file mode 100644 index 00000000000..85f3c2c0b07 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/examples/test.php @@ -0,0 +1,29 @@ +setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/38.0.2125.59 Mobile/12A405 Safari/600.1.4'); +var_dump($detect->version('Chrome')); +var_dump($detect->version('iPhone')); +*/ + +/* +$user_agents = array( + 'android' => 'Mozilla/5.0 (Linux; Android 4.2; Nexus 7 Build/JOP40C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19', + 'iphone6' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A523 Safari/8536.25', + 'blackberry' => 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+' +); +$mobile_detect = new Mobile_Detect; + +foreach($user_agents as $user_agent) +{ + $mobile_detect->setUserAgent($user_agent); + var_dump($mobile_detect->isAndroidOS()); +} +*/ + +$detect = new Mobile_Detect; +//$detect->setUserAgent('Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'); +//var_dump($detect->version('IE')); +$detect->setUserAgent('Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko'); +var_dump($detect->version('IE')); \ No newline at end of file diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/export/exportToJSON.php b/htdocs/includes/mobiledetect/mobiledetectlib/export/exportToJSON.php index f7735de7bf7..88ff6a10991 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/export/exportToJSON.php +++ b/htdocs/includes/mobiledetect/mobiledetectlib/export/exportToJSON.php @@ -47,7 +47,9 @@ $json = array( // If match is found, triggers 'isMobile' to be true. 'browsers' => $detect->getBrowsers(), // If match is found, triggers 'isMobile' to be true. - 'os' => $detect->getOperatingSystems() + 'os' => $detect->getOperatingSystems(), + // Various utilities. To be further discussed. + 'utilities' => $detect->getUtilities() ) ); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/BasicsTest.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/BasicsTest.php old mode 100644 new mode 100755 index 897a3ec764c..5519665ee7a --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/BasicsTest.php +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/BasicsTest.php @@ -1,29 +1,5 @@ * @license MIT License https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt * @link http://mobiledetect.net */ @@ -177,7 +153,8 @@ class BasicTest extends PHPUnit_Framework_TestCase /** * @dataProvider userAgentProvider - * @covers Mobile_Detect::setUserAgent, Mobile_Detect::getUserAgent + * @covers Mobile_Detect::setUserAgent + * @covers Mobile_Detect::getUserAgent */ public function testGetUserAgent($headers, $expectedUserAgent) { @@ -203,7 +180,56 @@ class BasicTest extends PHPUnit_Framework_TestCase } /** - * @covers Mobile_Detect::setUserAgent, Mobile_Detect::getUserAgent + * Read response from cloudfront, if the cloudfront headers are detected + * @covers Mobile_Detect::setCfHeaders + */ + public function testSetCfHeaders() + { + // Test mobile detected + $header1 = array( + 'HTTP_CLOUDFRONT_IS_DESKTOP_VIEWER' => 'false', + 'HTTP_CLOUDFRONT_IS_MOBILE_VIEWER' => 'true', + 'HTTP_CLOUDFRONT_IS_TABLET_VIEWER' => 'false' + ); + $md = new Mobile_Detect($header1); + $this->assertSame($md->getCfHeaders(), $header1); + $this->assertSame($md->getUserAgent(), 'Amazon CloudFront'); + $this->assertSame($md->isTablet(), false); + $this->assertSame($md->isMobile(), true); + + // Test neither mobile nor tablet (desktop) + $header2 = array( + 'HTTP_CLOUDFRONT_IS_DESKTOP_VIEWER' => 'true', + 'HTTP_CLOUDFRONT_IS_MOBILE_VIEWER' => 'false', + 'HTTP_CLOUDFRONT_IS_TABLET_VIEWER' => 'false' + ); + $md->setHttpHeaders($header2); + $this->assertSame($md->getCfHeaders(), $header2); + $this->assertSame($md->getUserAgent(), 'Amazon CloudFront'); + $this->assertSame($md->isTablet(), false); + $this->assertSame($md->isMobile(), false); + + // Test tablet detected + $header3 = array( + 'HTTP_CLOUDFRONT_IS_DESKTOP_VIEWER' => 'false', + 'HTTP_CLOUDFRONT_IS_MOBILE_VIEWER' => 'false', + 'HTTP_CLOUDFRONT_IS_TABLET_VIEWER' => 'true' + ); + $md->setCfHeaders($header3); + $this->assertSame($md->getCfHeaders(), $header3); + $this->assertSame($md->getUserAgent(), 'Amazon CloudFront'); + $this->assertSame($md->isTablet(), true); + $this->assertSame($md->isMobile(), false); + + // Check if the headers are cleared + $header4 = array(); + $md->setHttpHeaders($header4); + $this->assertSame($md->getCfHeaders(), $header4); + } + + /** + * @covers Mobile_Detect::setUserAgent + * @covers Mobile_Detect::getUserAgent */ public function testSetUserAgent() { @@ -461,7 +487,7 @@ class BasicTest extends PHPUnit_Framework_TestCase public function testScriptVersion() { $v = Mobile_Detect::getScriptVersion(); - $formatCheck = (bool)preg_match('/^[0-9]+\.[0-9]+\.[0-9](-[a-zA-Z0-9])?$/', $v); + $formatCheck = (bool)preg_match('/^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9])?$/', $v); $this->assertTrue($formatCheck, "Fails the semantic version test. The version " . var_export($v, true) . ' does not match X.Y.Z pattern'); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/UA_List.inc.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/UA_List.inc.php index dc87bfb2b14..5c4df79b9a4 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/UA_List.inc.php +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/UA_List.inc.php @@ -1,1220 +1,27 @@ - * * @license MIT License https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt * @link http://mobiledetect.net * - * This file is updated weekly. + * Compile the providers list. + * The providers list is updated weekly. * You can contribute by adding new user agents and tests. - * */ -return array( - - 'Acer' => array( - 'Mozilla/5.0 (Linux; U; Android 3.2.1; en-us; A100 Build/HTK55D) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; A110 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; A200 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Webkit' => '534.30', 'Safari' => '4.0', 'Build' => 'IML74K'), 'model' => 'A200' ), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; A500 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; A501 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.1; A701 Build/JRO03H) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.2; B1-A71 Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.2; B1-710 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; A1-810 Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; nl-nl; A1-810 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Acer; Allegro)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; A3-A10 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39', 'Webkit' => '537.36', 'Chrome' => '32.0.1700.99')), - 'Mozilla/5.0 (Linux; Android 4.2.2; A1-830 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - ), - - 'AdvanDigital' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; E1C Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; id-id; T3C Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Ainol' => array( - - 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Ainol Novo8 Advanced Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.1; Novo10 Hero Build/20121115) AppleWebKit/535.19 (KHTML like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; es-es; novo9-Spark Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - - ), - 'AllFine' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; FINE7 GENIUS Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - - ), - - 'ASUS' => array( - 'Mozilla/5.0 (Linux; U; Android 3.2.1; en-us; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '3.2.1', 'Webkit' => '534.13', 'Safari' => '4.0'), 'model' => 'Transformer TF101' ), - 'Mozilla/5.0 (Linux; Android 4.1.1; Transformer Build/JRO03L) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.1; ASUS Transformer Pad TF300T Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; fr-fr; Transformer Build/JZO54K; CyanogenMod-10) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; asus_laptop Build/IMM76L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; PadFone 2 Build/JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; PadFone 2 Build/JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03L', 'Webkit' => '534.30', 'Safari' => '4.0') ), - 'Mozilla/5.0 (Linux; Android 4.2.1; ME301T Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.1', 'Build' => 'JOP40D') ), - 'Mozilla/5.0 (Linux; Android 4.2.1; ME173X Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.1', 'Build' => 'JOP40D') ), - 'Mozilla/5.0 (Linux; Android 4.2.2; TF300T Build/JDQ39E) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39E') ), - ), - - 'Alcatel' => array( - 'Mozilla/5.0 (Linux; U; Android 2.3.7; en-in; MB525 Build/GWK74; CyanogenMod-7.2.0) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; it-it; ALCATEL ONE TOUCH 918D Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '2.3.5', 'Webkit' => '533.1', 'Safari' => '4.0', 'Build' => 'GRJ90'), 'model' => 'ONE TOUCH 918D' ), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; ALCATEL ONE TOUCH 991 Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '2.3.6', 'Webkit' => '533.1', 'Safari' => '4.0', 'Build' => 'GRJ90'), 'model' => 'ONE TOUCH 991' ), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; ALCATEL ONE TOUCH 993D Build/ICECREAM) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.0.4', 'Webkit' => '534.30', 'Safari' => '4.0', 'Build' => 'ICECREAM'), 'model' => 'ONE TOUCH 993D' ), - ), - - 'Allview' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; ALLVIEW P5 Build/IML74K) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us ; ALLVIEW SPEEDI Build/IMM76D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1/UCBrowser/8.5.3.246/145/355' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; AllviewCity Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; ALLVIEWSPEED Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - - ), - - 'Amazon' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.4 Mobile Safari/535.19 Silk-Accelerated=true' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; en-US) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) Version/4.0 Kindle/3.0 (screen 600x800; rotate)' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Webkit' => '528.5+', 'Kindle' => '3.0', 'Safari' => '4.0'), 'model' => 'Kindle' ), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFOTE Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'IML74K', 'Webkit' => '534.30', 'Safari' => '4.0') ), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; WFJWAE Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Apple' => array( - 'iTunes/9.1.1' => array('isMobile' => false, 'isTablet' => false), - 'iTunes/11.0.2 (Windows; Microsoft Windows 8 x64 Business Edition (Build 9200)) AppleWebKit/536.27.1' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A4449d Safari/9537.53' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543 Safari/419.3' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Webkit' => '420+', 'Safari' => '3.0') ), - 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '3_0', 'Webkit' => '528.18', 'Safari' => '4.0'), 'model' => 'iPhone', 'mobileGrade' => 'B' ), - 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '5_1_1', 'Webkit' => '534.46', 'Mobile' => '9B206', 'Safari' => '5.1'), 'model' => 'iPhone' ), - 'Mozilla/5.0 (iPod; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '6_0', 'Webkit' => '536.26', 'Mobile' => '10A403', 'Safari' => '6.0'), 'model' => 'iPod'), - 'Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X; en-us) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/21.0.1180.80 Mobile/9B206 Safari/7534.48.3 (6FF046A0-1BC4-4E7D-8A9D-6BF17622A123)' => array('isMobile' => true, 'isTablet' => true, 'version' => array('iOS' => '5_1_1', 'Webkit' => '534.46.0', 'Chrome' => '21.0.1180.80', 'Mobile' => '9B206'), 'model' => 'iPad' ), - 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25' => array('isMobile' => true, 'isTablet' => true, 'version' => array('iOS' => '6_0', 'Webkit' => '536.26', 'Safari' => '6.0', 'Mobile' => '10A403'), 'model' => 'iPad' ), - 'Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5' => array('isMobile' => true, 'isTablet' => true, 'version' => array('iOS' => '4_2_1', 'Webkit' => '533.17.9', 'Safari' => '5.0.2', 'Mobile' => '8C148'), 'model' => 'iPad', 'mobileGrade' => 'B' ), - 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10' => array('isMobile' => true, 'isTablet' => true, 'version' => array('iOS' => '3_2', 'Webkit' => '531.21.10', 'Safari' => '4.0.4', 'Mobile' => '7B334b'), 'model' => 'iPad', 'mobileGrade' => 'B' ), - 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X; da-dk) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/21.0.1180.82 Mobile/10A523 Safari/7534.48.3' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '6_0_1', 'Webkit' => '534.46.0', 'Chrome' => '21.0.1180.82', 'Mobile' => '10A523'), 'model' => 'iPhone', 'mobileGrade' => 'A' ), - 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A523 Safari/8536.25' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '6_0_1', 'Webkit' => '536.26', 'Safari' => '6.0', 'Mobile' => '10A523'), 'model' => 'iPhone', 'mobileGrade' => 'A' ), - 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X; ru-ru) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/23.0.1271.100 Mobile/10B142 Safari/8536.25' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '6_1', 'Webkit' => '536.26', 'Chrome' => '23.0.1271.100', 'Mobile' => '10B142'), 'model' => 'iPhone', 'mobileGrade' => 'A' ), - 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '6_1_3', 'Webkit' => '536.26', 'Safari' => '6.0', 'Mobile' => '10B329'), 'model' => 'iPhone', 'mobileGrade' => 'A' ), - 'Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Coast/1.0.2.62956 Mobile/10B329 Safari/7534.48.3' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Coast' => '1.0.2.62956')), - ), - - 'Archos' => array( - - 'Mozilla/5.0 (Linux; Android 4.2.2; Qilive 97R Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.2; Archos 50 Platinum Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; ARCHOS 80G9 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.2.1; fr-fr; A101IT Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; Archos 101 Neon Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true - ), - ), - - 'AudioSonic' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-au; T-17B Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'BlackBerry' => array( - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9300; en) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.546 Mobile Safari/534.8+' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Webkit' => '534.8+', 'BlackBerry' => '6.0.0.546'), 'model' => 'BlackBerry 9300' ), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9360; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.400 Mobile Safari/534.11+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9700; he) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.723 Mobile Safari/534.8+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9700; en-US) AppleWebKit/534.8 (KHTML, like Gecko) Version/6.0.0.448 Mobile Safari/534.8' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9790; en-GB) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.714 Mobile Safari/534.11+' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Webkit' => '534.11+', 'BlackBerry' => '7.1.0.714'), 'model' => 'BlackBerry 9790' ), - 'Opera/9.80 (BlackBerry; Opera Mini/7.0.29990/28.2504; U; en) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9981; en-GB) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.342 Mobile Safari/534.11+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en-GB) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.546 Mobile Safari/534.8+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9780; es) AppleWebKit/534.8 (KHTML, like Gecko) Version/6.0.0.480 Mobile Safari/534.8' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9810; en-US) AppleWebKit/534.11 (KHTML, like Gecko) Version/7.0.0.583 Mobile Safari/534.11' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9860; es) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.576 Mobile Safari/534.11+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit/534.11 (KHTML, like Gecko) Version/7.1.0.523 Mobile Safari/534.11' => array('isMobile' => true, 'isTablet' => false), - 'BlackBerry8520/5.0.0.592 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/136' => array('isMobile' => true, 'isTablet' => false), - 'BlackBerry8520/5.0.0.1067 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/603' => array('isMobile' => true, 'isTablet' => false), - 'BlackBerry8520/5.0.0.1036 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/611' => array( 'isMobile' => true, 'isTablet' => false, 'version' => array('BlackBerry' => '5.0.0.1036', 'VendorID' => '611'), 'model' => 'BlackBerry8520' ), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9220; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.337 Mobile Safari/534.11+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML, like Gecko) Version/7.2.1.0 Safari/536.2+' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.1+ (KHTML, like Gecko) Version/10.0.0.1337 Mobile Safari/537.1+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BB10; Touch) /537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+' => array( 'isMobile' => true, 'isTablet' => false, 'version' => array('BlackBerry' => '10.0.9.2372') ), - 'Mozilla/5.0 (Linux; U; Android 3.2.1; en-us; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '3.2.1', 'Webkit' => '534.13', 'Safari' => '4.0'), 'model' => 'Transformer TF101' ), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; A200 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Webkit' => '534.30', 'Safari' => '4.0'), 'model' => 'A200' ), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; A500 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Webkit' => '534.30', 'Safari' => '4.0'), 'model' => 'A500' ), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; A501 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Webkit' => '534.30', 'Safari' => '4.0'), 'model' => 'A501' ), - 'Mozilla/5.0 (Linux; Android 4.1.1; Transformer Build/JRO03L) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Webkit' => '535.19', 'Chrome' => '18.0.1025.166'), 'model' => 'Transformer' ), - 'Mozilla/5.0 (Linux; Android 4.1.1; ASUS Transformer Pad TF300T Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Webkit' => '535.19', 'Chrome' => '18.0.1025.166'), 'model' => 'Transformer Pad TF300T' ), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; fr-fr; Transformer Build/JZO54K; CyanogenMod-10) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.2', 'Webkit' => '534.30', 'Safari' => '4.0', 'Build' => 'JZO54K'), 'model' => 'Transformer' ), - 'Mozilla/5.0 (Linux; Android 4.1.2; B1-A71 Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.2', 'Webkit' => '535.19', 'Chrome' => '18.0.1025.166'), 'model' => 'B1-A71' ), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Acer; Allegro)' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Windows Phone OS' => '7.5', 'Trident' => '5.0', 'IE' => '9.0'), 'model' => 'Allegro' ), - ), - - 'Broncho' => array( - - 'Mozilla/5.0 (Linux; U; Android 2.2; es-es; Broncho N701 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - - ), - - // @ref: http://www.bqreaders.com/gb/tablets-prices-sale.html - 'bq' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-es; bq Livingstone 2 Build/1.1.7 20121018-10:33) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-es; bq Edison Build/1.1.10-1015 20121230-18:00) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.3; Maxwell Lite Build/v1.0.0.ICS.maxwell.20120920) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; zh-tw; bq Maxwell Plus Build/1.0.0 20120913-10:39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Captiva' => array( - 'Opera/9.80 (X11; Linux zvav; U; de) Presto/2.8.119 Version/11.10 Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; CAPTIVA PAD 10.1 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - ), - - 'Casio' => array( - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; C771 Build/C771M120) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - ), - - 'ChangJia' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.0.4; pt-br; TPC97113 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; TPC7102 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true) - - ), - - // @ref: http://www.cobyusa.com/?p=pcat&pcat_id=3001 - 'Coby' => array( - 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; MID7010 Build/FRF85B) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; MID7048 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; MID8042 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Concorde' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; hu-hu; ConCorde Tab T10 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; hu-hu; ConCorde tab PLAY Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Cresta' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.4; nl-nl; CRESTA.CTP888 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Cube' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; CUBE U9GT 2 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Danew' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.0.3; es-es; Dslide 700 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array( 'Android' => '4.0.3', 'Build' => 'IML74K', 'Webkit' => '534.30', 'Safari' => '4.0' ), 'model' => 'Dslide 700' ) - - ), - - 'DanyTech' => array( - 'Mozilla/5.0 (Linux; Android 4.2.2; Genius Tab Q4 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Dell' => array( - 'Mozilla/5.0 (Linux; U; Android 1.6; en-gb; Dell Streak Build/Donut AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/ 525.20.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; hd-us; Dell Venue Build/GWK74; CyanogenMod-7.2.0) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; DELL; Venue Pro)' => array('isMobile' => true, 'isTablet' => false), - ), - - 'DPS' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; DPS Dream 9 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'ECS' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.4; it-it; TM105A Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'IMM76D', 'Webkit' => '534.30')) - ), - - 'Eboda' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Supreme Dual Core X190 Build/JRO03C) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Webkit' => '534.30', 'Safari' => '4.0')), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Essential A160 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.3; E-Boda Supreme X80 Dual Core Build/ICS.g12refM806A1YBD.20120925) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ro-ro; E-boda essential smile Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Fly' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; Fly IQ440; Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; FLY IQ256 Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - ), - - 'Fujitsu' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.0.3; ja-jp; F-10D Build/V21R48A) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'V21R48A', 'Webkit' => '534.30', 'Safari' => '4.0') ), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; M532 Build/IML74K) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'IML74K', 'Webkit' => '534.30', 'Safari' => '4.0') ), - - ), - - 'FX2' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; FX2 PAD7 RK Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - - ), - - // @ref: http://www.galapad.net/product.html - 'Galapad' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-tw; G1 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Webkit' => '534.30', 'Safari' => '4.0', 'Build' => 'JRO03C') ), - - ), - - 'GoClever' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.3; el-gr; GOCLEVER TAB A103 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; zh-tw; A7GOCLEVER Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.4; GOCLEVER TAB A104 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; cs-cz; GOCLEVER TAB A93.2 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; sk-sk; GOCLEVER TAB A971 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; lv-lv; GOCLEVER TAB A972BK Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; fr-fr; GOCLEVER TAB A104.2 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; pt-pt; GOCLEVER TAB T76 Build/MID) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Google' => array( - 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; Nexus 4 Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.40 Mobile Safari/537.31 OPR/14.0.1074.54070' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39', 'Webkit' => '537.31', 'Opera' => '14.0.1074.54070') ), - 'Mozilla/5.0 (Linux; Android 4.2.2; Nexus 4 Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.2.2', 'Chrome' => '26.0.1410.58')), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; Google Nexus 4 - 4.1.1 - API 16 - 768x1280 Build/JRO03S) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; Google Galaxy Nexus - 4.1.1 - API 16 - 720x1280 Build/JRO03S) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2; Nexus 7 Build/JOP40C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.2; Nexus 7 Build/JZ054K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.2', 'Chrome' => '18.0.1025.166') ), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; cs-cz; Nexus S Build/JZO54K; CyanogenMod-10.0.0) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; Nexus 10 Build/JWR66Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android; en_us; Nexus 7 Build/) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 NetFrontLifeBrowser/2.3 Mobile (Dragonfruit)' => array('isMobile' => true, 'isTablet' => true), - ), - - 'GU' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.0.4; vi-vn; TX-A1301 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'IMM76D', 'Webkit' => '534.30', 'Safari' => '4.0')), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; da-dk; Q702 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'IML74K', 'Webkit' => '534.30', 'Safari' => '4.0')), - - ), - - 'HCL' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; U1 Build/HCL ME Tablet U1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; U1 Build/HCL ME Tablet U1) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.2; Connect-3G-2.0 Build/HCL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; pt-br; X1 Build/HCL ME Tablet X1) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - ), - - 'HP' => array( - 'Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.5; U; en-GB) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.83 Safari/534.6 TouchPad/1.0' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; HP Slate 7 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.1; HP Slate 7 Build/JRO03H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; HP 8 Build/1.0.7_WW-FIR-13) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'HTC' => array( - 'Mozilla/5.0 (X11; Linux x86_64; Z520m; en-ca) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24' => array('isMobile' => true, 'isTablet' => false), - 'HTC_Touch_HD_T8282 Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 1.5; en-us; ADR6200 Build/CUPCAKE) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.1; xx-xx; Desire_A8181 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.1-update1; de-de; HTC Desire 1.19.161.5 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.1-update1; en-gb; HTC Desire Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2; fr-fr; HTC Desire Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2; en-dk; Desire_A8181 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2; xx-xx; 001HT Build/FRF91) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2; xx-xx; HTCA8180/1.0 Android/2.2 release/06.23.2010 Browser/WAP 2.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2.2; de-at; HTC Desire Build/FRG83G) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2.2; en-sk; Desire_A8181 Build/FRG83G) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3; xx-xx; HTC/DesireS/1.07.163.1 Build/GRH78C) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-lv; HTC_DesireZ_A7272 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; ADR6300 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; en-gb; HTC/DesireS/2.10.161.3 Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC_DesireS_S510e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; Inspire 4G Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; de-de; HTC Explorer A310e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; en-gb; HTC_ChaCha_A810e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; nl-nl; HTC_DesireHD_A9191 Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC Desire S Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-au; HTC Desire Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; de-de; HTC_DesireHD Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ua; HTC_WildfireS_A510e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; HTC Vision Build/GRI40; ILWT-CM7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; HTC_GOF_U/1.05.161.1 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; hu-hu; HTC Sensation Z710e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; pl-pl; EVO3D_X515m Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; HTC_One_S Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; HTC_One_V Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; HTC_A320e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; zh-tw; HTC Desire V Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; PG86100 Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-nl; SensationXE_Beats_Z715e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; ADR6425LVW 4G Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; cs-ee; Sensation_Z710e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; HTC Evo 4G Build/MIUI) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; Desire HD Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-my; HTC_One_X Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; it-it; IncredibleS_S710e Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; fr-fr; HTC_Desire_S Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC Butterfly Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; EVO Build/JRO03C) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; HTCSensation Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC 7 Mozart T8698; QSD8x50)' => array( - 'isMobile' => true, 'isTablet' => false, 'version' => array('IE' => '9.0', 'Windows Phone OS' => '7.5', 'Trident' => '5.0'), 'model' => '7 Mozart T8698', - ), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 HTC MOZART)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Mondrian T8788)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Mozart T8698)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Mozart)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Mozart; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Pro T7576)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Pro)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Schubert T9292)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Surround)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Trophy T8686)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Trophy)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Eternity)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Gold)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; HD2 LEO)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; HD2)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; HD7 T9292)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; HD7)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; iPad 3)' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; LEO)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Mazaa)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Mondrian)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Mozart T8698)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Mozart)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; mwp6985)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; PC40100)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; PC40200)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; PD67100)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; PI39100)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; PI86100)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar 4G)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar C110e)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar C110e; 1.08.164.02)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar C110e; 2.05.164.01)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar C110e; 2.05.168.02)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Schuber)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Schubert T9292)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Schubert)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Spark)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Surround)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; T7575)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; T8697)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; T8788)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; T9295)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; T9296)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; TITAN X310e)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Torphy T8686)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; X310e)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC_blocked; T8788)' => array( - 'isMobile' => true, 'isTablet' => false, 'version' => array('IE' => '9.0', 'Windows Phone OS' => '7.5', 'Trident' => '5.0'), 'model' => 'T8788', - ), - - ), - - 'Hudl' => array( - 'Mozilla/5.0 (Linux; Android 4.2.2; Hudl HT7S3 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Huwaei' => array( - 'Mozilla/5.0 (Linux; U; Android 2.1-update1; bg-bg; Ideos S7 Build/ERE27) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Ideos S7 Build/ERE27) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; lt-lt; U8660 Build/HuaweiU8660) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; ru-ru; HUAWEI-U8850 Build/HuaweiU8850) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 3.2; pl-pl; MediaPad Build/HuaweiMediaPad) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 3.2; nl-nl; HUAWEI MediaPad Build/HuaweiMediaPad) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'HUAWEI_T8951_TD/1.0 Android/4.0.4 (Linux; U; Android 4.0.4; zh-cn) Release/05.31.2012 Browser/WAP2.0 (AppleWebKit/534.30) Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; ar-eg; MediaPad 7 Youth Build/HuaweiMediaPad) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; zh-cn; HW-HUAWEI_C8815/C8815V100R001C541B135; 540*960; CTC/2.0) AppleWebKit/534.30 (KHTML, like Gecko) Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; HW-HUAWEI_C8813D/C8813DV100R001C92B172; 480*854; CTC/2.0) AppleWebKit/534.30 (KHTML, like Gecko) Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; HW-HUAWEI_Y300C/Y300CV100R001C92B168; 480*800; CTC/2.0) AppleWebKit/534.30 (KHTML, like Gecko) Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false) - ), - - 'Iconbit' => array( - 'Mozilla/5.0 (Linux; Android 4.1.1; NT-3702M Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36 OPR/16.0.1212.65583' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; NetTAB SPACE II Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'iJoy' => array('Mozilla/5.0 (Linux; U; Android 4.1.1; fr-fr; Tablet Planet II-v3 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true)), - - 'Intenso' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1.;de-de; INM8002KP Build/JR003H) AppleWebKit/534.30 (KHTML, like Gecko)Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1.', 'Webkit' => '534.30', 'Safari' => '4.0') ), - ), - - 'IRU' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; M702pro Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - - ), - - 'JXD' => array('Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; F3000 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true) - ), - - 'Karbonn' => array( - 'Mozilla/5.0 (Linux; Android 4.1.1; ST10 Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Kobo' => array( - 'Mozilla/5.0 (Linux; U; Android 2.0; en-us;) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 (Kobo Touch)' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '2.0', 'Webkit' => '533.1', 'Safari' => '4.0') ), - ), - - 'Lenovo' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-es; IdeaTab_A1107 Build/MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.3; IdeaTab A2107A-H Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-au; ThinkPad Tablet Build/ThinkPadTablet_A400_03) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'UCWEB/2.0 (Linux; U; Opera Mini/7.1.32052/30.3697; en-US; IdeaTabA1000-G) U2/1.0.0 UCBrowser/9.2.0.419 Mobile' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.2; IdeaTabA1000-F Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.1; Lenovo A3000-H Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.117 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; IdeaTab A3000-F Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.360' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1; zh-cn; Lenovo-A3000-H/S100) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.1 Mobile Safari/534.300' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; es-us; IdeaTab A3000-F Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.3; IdeaTab A2107A-H Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; IdeaTab A2107A-H Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; es-es; IdeaTabA2109A Build/JRO03R) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; nl-nl; IdeaTabA2109A Build/JRO03R) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-es; IdeaTab_A1107 Build/MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.300' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; IdeaTab S6000-H Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; IdeaTab S6000-F Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; Lenovo B8000-F Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2;it-it; Lenovo B8000-F/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; it-it; Lenovo B6000-F/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; Lenovo B6000-F Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - - ), - - 'LG' => array( - 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; LG-P509 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2.2; pt-br; LG-P350f Build/FRG83G) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; LG-P500 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; LS670 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; ru-ru; LG-E510 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; VS910 4G Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; nl-nl; LG-P700 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; LG-F160S Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; nl-nl; LG-E610v/V10f Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; LG-E612 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; LG-F180K Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; LG-V500 Build/JDQ39B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; LG-LW770 Build/IMM76I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; LG-V510 Build/KOT49H.L004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG E-900)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-C900)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-C900k)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-E900)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-E900; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-E900h)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-Optimus 7)' => array('isMobile' => true, 'isTablet' => false), - // @ref: http://ja.wikipedia.org/wiki/L-06C - 'Mozilla/5.0 (Linux; U; Android 3.0.1; ja-jp; L-06C Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 3.0; en-us; LG-V900 Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Megafon' => array( - - 'Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ru; MegaFon V9 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.1; MT7A Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31' => array('isMobile' => true, 'isTablet' => true), - - ), - - 'MediaTek' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; fr-fr; MT8377 Build/JRO03C) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30/4.05d.1002.m7' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Micromax' => array( - - 'Mozilla/5.0 (Linux; Android 4.1.1; Micromax A110 Build/JRO03C) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03C', 'Webkit' => '537.22', 'Chrome' => '25.0.1364.169') ), - 'Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; Micromax P250(Funbook) Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Webkit' => '534.30', 'Android' => '4.0', 'Build' => 'IMM76D', 'Safari' => '4.0') ), - - ), - - 'Microsoft' => array( - - // Surface tablet - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch; .NET4.0E; .NET4.0C; Tablet PC 2.0)' => array('isMobile' => true, 'isTablet' => true, 'version' => array('IE' => '10.0', 'Windows NT' => '6.2', 'Trident' => '6.0') ), - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch; ARMBJS)' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; Touch; MASMJS)' => array('isMobile' => false, 'isTablet' => false), - - // Thanks to Jonathan Donzallaz! - // Firefox (nightly) in metro mode on Dell XPS 12 - 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:25.0) Gecko/20130626 Firefox/25.0' => array('isMobile' => false, 'isTablet' => false), - // Firefox in desktop mode on Dell XPS 12 - 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0' => array('isMobile' => false, 'isTablet' => false), - // IE10 in metro mode on Dell XPS 12 - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; MDDCJS)' => array('isMobile' => false, 'isTablet' => false), - // IE10 in desktop mode on Dell XPS 12 - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; MDDCJS)' => array('isMobile' => false, 'isTablet' => false), - // Opera on Dell XPS 12 - 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130' => array('isMobile' => false, 'isTablet' => false), - // Chrome on Dell XPS 12 - 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), - // Google search app from Windows Store - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; Touch; MDDCJS; WebView/1.0)' => array('isMobile' => false, 'isTablet' => false), - ), - - 'Modecom' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.2; pl-pl; FreeTAB 1014 IPS X4+ Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Motorola' => array( - 'MOT-W510/08.11.05R MIB/BER2.2 Profile/MIDP-2.0 Configuration/CLDC-1.1 EGE/1.0 UP.Link/6.3.0.0.0' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2.2; zh-cn; ME722 Build/MLS2GC_2.6.0) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; DROIDX Build/4.5.1_57_DX8-51) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; MB855 Build/4.5.1A-1_SUN-254_13) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; es-us; MB526 Build/4.5.2-51_DFL-50) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-ca; MB860 Build/4.5.2A-51_OLL-17.8) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; MOT-XT535 Build/V1.540) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; ko-kr; A853 Build/SHOLS_U2_05.26.3; CyanogenMod-7.1.2) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 3.1; en-us; Xoom Build/HMJ25) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; DROID RAZR 4G Build/6.7.2-180_DHD-16_M4-31) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; Xoom Build/IMM76L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; pt-br; XT687 Build/V2.27D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.0.4', 'Webkit' => '534.30', 'Safari' => '4.0'), 'model' => 'XT687' ), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-es; MOT-XT910 Build/6.7.2-180_SPU-19-TA-11.6) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; XT910 Build/9.8.2O-124_SPUL-17) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; XT915 Build/2_32A_2031) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; XT919 Build/2_290_2017) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.64 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; XT925 Build/9.8.2Q-50-XT925_VQLM-20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; XT907 Build/9.8.1Q-66) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; XT901 Build/9.8.2Q-50_SLS-13) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; DROID BIONIC Build/9.8.2O-72_VZW-22) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - ), - - // @ref: https://www.nabitablet.com/ - 'Nabi' => array( - 'Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; NABI-A Build/MASTER) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - ), - - 'NEC' => array( - // @ref: http://www.n-keitai.com/n-08d/?from=mediasnet - // @ref: http://devlog.dcm-gate.com/2012/03/medias-tab-n-06duseragnet.html - // @ref: http://keitaiall.jp/N-08D.html aka MEDIAS TAB - 'Mozilla/5.0 (Linux; U; Android 4.0.4; ja-jp; N-08D Build/A5001911) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android AAA; BBB; N-06D Build/CCC) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - - ), - - 'Nook' => array( - - 'Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; NOOK BNRV200 Build/ERD79 1.4.3) Apple WebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '2.2.1', 'Webkit' => '533.1', 'Safari' => '4.0') ), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; NOOK BNTV400 Build/ICS) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'ICS', 'Webkit' => '534.30', 'Safari' => '4.0') ), - 'Mozilla/5.0 (Linux; Android 4.0.4; BNTV600 Build/IMM76L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36 Hughes-PFB/CID5391275.AID1376709964' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'IMM76L', 'Webkit' => '537.36', 'Chrome' => '28.0.1500.94') ), - - ), - - 'Nokia' => array( - 'Nokia200/2.0 (12.04) Profile/MIDP-2.1 Configuration/CLDC-1.1 UCWEB/2.0 (Java; U; MIDP-2.0; en-US; nokia200) U2/1.0.0 UCBrowser/8.9.0.251 U2/1.0.0 Mobile UNTRUSTED/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Nokia6303iclassic/5.0 (06.61) Profile/MIDP-2.1 Configuration/CLDC-1.1 Mozilla/5.0 AppleWebKit/420+ (KHTML, like Gecko) Safari/420+' => array('isMobile' => true, 'isTablet' => false), - 'nokian73-1/UC Browser7.8.0.95/69/400 UNTRUSTED/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Nokia2760/2.0 (06.82) Profile/MIDP-2.1 Configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), - 'Nokia3650/1.0 SymbianOS/6.1 Series60/1.2 Profile/MIDP-1.0 Configuration/CLDC-1.0' => array('isMobile' => true, 'isTablet' => false), - 'NokiaN70-1/5.0737.3.0.1 Series60/2.8 Profile/MIDP-2.0 Configuration/CLDC-1.1/UC Browser7.8.0.95/27/352' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (S60V3; U; ru; NokiaN73) AppleWebKit/530.13 (KHTML, like Gecko) UCBrowser/8.6.0.199/28/444/UCWEB Mobile' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (S60V3; U; ru; NokiaC5-00.2)/UC Browser8.5.0.183/28/444/UCWEB Mobile' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (S60V3; U; ru; NokiaC5-00.2) AppleWebKit/530.13 (KHTML, like Gecko) UCBrowser/8.7.0.218/28/352/UCWEB Mobile' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Series40; NokiaC3-00/08.63; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/2.2.0.0.33' => array('isMobile' => true, 'isTablet' => false), - 'Opera/9.80 (Series 60; Opera Mini/7.0.31380/28.2725; U; es) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Opera Mini' => '7.0.31380', 'Presto' => '2.8.119')), - 'Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaC7-00/025.007; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.37 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaX7-00/022.014; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.37 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.3 NokiaE6-00/111.140.0058; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/535.1 (KHTML, like Gecko) NokiaBrowser/8.3.1.4 Mobile Safari/535.1 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.3 NokiaC6-01/111.040.1511; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/535.1 (KHTML, like Gecko) NokiaBrowser/8.3.1.4 Mobile Safari/535.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.3 NokiaC6-01; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.4.2.6 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.3 Nokia700/111.030.0609; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.4.2.6 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.3 Nokia700/111.020.0308; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.4.1.14 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.3 NokiaN8-00/111.040.1511; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/535.1 (KHTML, like Gecko) NokiaBrowser/8.3.1.4 Mobile Safari/535.1 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.3 Nokia701/111.030.0609; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.4.2.6 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 Nokia6120c/3.83; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 Nokia6120ci/7.02; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 Nokia6120c/7.10; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE66-1/510.21.009; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE71-1/110.07.127; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaN95-3/20.2.011 Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE51-1/200.34.36; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE63-1/500.21.009; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaN82/10.0.046; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE52-1/052.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.2' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE52-1/@version@; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.26 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaC5-00/031.022; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.3.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaC5-00.2/081.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.32 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; U; Series60/3.2 NokiaN79-1/32.001; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; U; Series60/3.2 Nokia6220c-1/06.101; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaC5-00.2/071.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.26 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE72-1/081.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.32 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaC5-00/061.005; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.2 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaX6-00/40.0.002; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.33 Mobile Safari/533.4 3gpp-gb' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 Nokia5800d-1/60.0.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.33 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaC5-03/12.0.023; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.9 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 Nokia5228/40.1.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.7.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 Nokia5230/51.0.002; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.33 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 Nokia5530c-2/32.0.007; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.9 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/21.0.045; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.4' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-4/30.0.004; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.28 3gpp-gba' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Symbian' => '9.4', 'Webkit' => '533.4', 'NokiaBrowser' => '7.3.1.28'), 'model' => 'NokiaN97-4' ), - - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 7 Mozart T8698)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; 710)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 800)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 800C)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 800C; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 900)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; HD7 T9292)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; LG E-900)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 610)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 710)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 710; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 710; T-Mobile)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 710; Vodafone)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800) UP.Link/5.1.2.6' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800; SFR)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800; T-Mobile)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800; vodafone)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; Lumia 800c)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 900)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; Lumia 920)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)' => array('isMobile' => true, 'isTablet' => false, 'version' => array('IE' => '10.0', 'Windows Phone OS' => '8.0', 'Trident' => '6.0'), 'model' => 'Lumia 920' ), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; lumia800)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Nokia 610)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Nokia 710)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Nokia 800)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Nokia 800C)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Nokia 900)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; Nokia)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; SGH-i917)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; TITAN X310e)' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Windows Phone OS' => '7.5', 'Trident' => '5.0'), 'model' => 'TITAN X310e' ), - ), - - 'Odys' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; LOOX Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; LOOX Plus Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.X; de-de; XENO10 Build/ODYS XENO 10) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.2.2; de-de; ODYS Space Build/I700T_P7_T04_TSCL_FT_R_0_03_1010_110623) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - ), - - 'OverMax' => array( - 'OV-SteelCore(B) Mozilla/5.0 (iPad; CPU OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; pl-pl; OV-SteelCore Build/ICS.g08refem611.20121010) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'YONESTablet' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.4; pl-pl; BC1077 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - // @todo: Research http://www.pantech.com/ - 'Pantech' => array( - 'PANTECH-C790/JAUS08312009 Browser/Obigo/Q05A Profile/MIDP-2.0 Configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2.1; ko-kr; SKY IM-A600S Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; ADR8995 4G Build/GRI40) AppleWebKit/533.1 (KHTML like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 3.2.1; en-us; PantechP4100 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Philips' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; W732 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - - ), - - 'PointOfView' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; POV_TAB-PROTAB30-IPS10 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Prestigio' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; PMP5297C_QUAD Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; sk-sk; PMP7100D3G Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'IMM76D', 'Webkit' => '534.30', 'Safari' => '4.0'), 'model' => 'PMP7100D3G' ), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; sk-sk; PMP7280C3G Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 MobilSafari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'PROSCAN' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; PLT8088 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03H', 'Webkit' => '534.30', 'Safari' => '4.0') ), - ), - - 'PyleAudio' => array( - 'Mozilla/5.0 (Linux; Android 4.0.4; PTBL92BC Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'IMM76D', 'Webkit' => '537.36', 'Chrome' => '31.0.1650.59')), - - ), - - 'RockChip' => array( - 'Mozilla/5.0 (Linux; U; Android 2.2.1; hu-hu; RK2818, Build/MASTER) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android Android 2.1-RK2818-1.0.0; zh-cn; MD701 Build/ECLAIR) AppleWebKit/530.17 (KHTML like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => true), - ), - - 'RossMoor' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.1; ru-ru; RM-790 Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true) - - ), - - // @ref: http://www.qmobile.com.pk/complete_range.php# - 'QMobile' => array( - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; A2 Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - ), - - 'Samsung' => array( - 'MQQBrowser/4.0/Mozilla/5.0 (Linux; U; Android 3.2; zh-cn; GT-P6800 Build/HTJ85B) AppleWebKit/533.1 (KHTML, like Gecko) Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true, 'version' => array('MQQBrowser' => '4.0')), - 'SAMSUNG-SGH-P250-ORANGE/P250BVHH8 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0' => array('isMobile' => true, 'isTablet' => false), - 'SAMSUNG-GT-B2710/B271MCXKF1 SHP/VPP/R5 Dolfin/2.0 QTV/5.3 SMM-MMS/1.2.0 profile/MIDP-2.1 configuration/CLDC-1.1 OPN-B' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Dolfin' => '2.0') ), - 'SAMSUNG-SGH-D900i/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0' => array('isMobile' => true, 'isTablet' => false), - 'SAMSUNG-GT-S5233T/S5233TXEJE3 SHP/VPP/R5 Jasmine/0.8 Qtv5.3 SMM-MMS/1.2.0 profile/MIDP-2.1 configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S5380D/S5380FXXKL3; U; Bada/2.0; ru-ru) AppleWebKit/534.20 (KHTML, like Gecko) Dolfin/3.0 Mobile HVGA SMM-MMS/1.2.0 OPN-B' => array('isMobile' => true, 'isTablet' => false), - 'SAMSUNG-GT-C3312/1.0 NetFront/4.2 Profile/MIDP-2.0 Configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 1.5; de-de; Galaxy Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => array('isMobile' => true, 'isTablet' => false), - 'SAMSUNG-GT-S3650/S3650XEII3 SHP/VPP/R5 Jasmine/1.0 Nextreaming SMM-MMS/1.2.0 profile/MIDP-2.1 configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), - 'JUC (Linux; U; 2.3.6; zh-cn; GT-S5360; 240*320) UCWEB7.9.0.94/140/352' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S5250/S5250XEKJ3; U; Bada/1.0; ru-ru) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.0 Mobile WQVGA SMM-MMS/1.2.0 NexPlayer/3.0 profile/MIDP-2.1 configuration/CLDC-1.1 OPN-B' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; SAMSUNG; SGH-i917)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S8530/S8530XXJKA; U; Bada/1.2; cs-cz) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.2 Mobile WVGA SMM-MMS/1.2.0 OPN-B' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 1.6; ru-ru; Galaxy Build/Donut) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.1-update1; ru-ru; GT-I5500 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; GALAXY_Tab Build/MASTER) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.2; ja-jp; SC-01C Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - // @about FROYO: http://gizmodo.com/5543853/what-is-froyo - 'Mozilla/5.0 (Linux; U; Android 2.2; fr-fr; GT-I9000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2.1; zh-cn; SCH-i909 Build/FROYO) UC AppleWebKit/534.31 (KHTML, like Gecko) Mobile Safari/534.31' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; ja-jp; SC-01C Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-gb; GT-P1000 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; el-gr; GT-I9001 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-ca; SGH-I896 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; es-us; GT-S5660L Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.1.261' => array('isMobile' => true, 'isTablet' => false, 'version' => array('MicroMessenger' => '4.5.1.261')), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-S6102 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; pt-br; GT-S5367 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; fr-fr; GT-S5839i Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S7500 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S5830 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; es-us; GT-B5510L Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; pl-pl; GT-I9001-ORANGE/I9001BVKPC Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; GT-I8150 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; nl-nl; GT-I9070 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S5360 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; es-us; GT-S6102B Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; GT-S5830i Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-I8160 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-S6802 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; ru-ru; GT-S5830 Build/GRWK74; LeWa_ROM_Cooper_12.09.21) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-N7000 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; GT-P7100 Build/HRI83) AppleWebkit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 3.2; he-il; GT-P7300 Build/HTJ85B) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 3.2; en-gb; GT-P6200 Build/HTJ85B) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-gb; GT-I9100 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; GT-I9100G Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; nl-nl; GT-P5100 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android-4.0.3; en-us; Galaxy Nexus Build/IML74K) AppleWebKit/535.7 (KHTML, like Gecko) CrMo/16.0.912.75 Mobile Safari/535.7' => array( 'isMobile' => true, 'isTablet' => false, 'version' => array('Chrome' => '16.0.912.75') ), - 'Mozilla/5.0 (Linux; Android 4.0.3; SGH-T989 Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Chrome' => '18.0.1025.166') ), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P5100 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.4; GT-I9300 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; SPH-D710 Build/IMM76I) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; zh-cn; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300-ORANGE/I9300BVBLG2 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; th-th; GT-I9300T Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-I9100 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us ; GT-I9100 Build/IMM76D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1/UCBrowser/8.4.1.204/145/355' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-N7000 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; th-th; GT-P6800 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.4; SAMSUNG-SGH-I747 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; es-es; GT-P5110 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.4; GT-P5110 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; zh-cn; SAMSUNG-GT-S7568_TD/1.0 Android/4.0.4 Release/07.15.2012 Browser/AppleWebKit534.30 Build/IMM76D) ApplelWebkit/534.30 (KHTML,like Gecko) Version/4.0 Mobile Safari/534.30' => array( 'isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.0.4') ), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P3100 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; tr-tr; GT-P3105 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-ca; GT-N8010 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-S7562 Build/IMM76I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; GT-N7100 Build/JZO54K) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Mobile Safari/537.22 OPR/14.0.1025.52315' => array( 'isMobile' => true, 'isTablet' => false, 'version' => array( 'Build' => 'JZO54K', 'Webkit' => '537.22', 'Opera' => '14.0.1025.52315' ) ), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-hk; GT-N7105 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; GT-N8000 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.1; SGH-i747M Build/JRO03L) AppleWebKit/535.19(KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Galaxy Nexus - 4.1.1 - with Google Apps - API 16 - 720x1280 Build/JRO03S) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; GT-I8262 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; it-it; Galaxy Nexus Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; SGH-I777 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; GT-S7710 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; GT-I9082 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; SGH-T999L Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; GT-P5210 Build/JDQ39) AppleWebKit/537.36 (KHTML, Like Gecko) Chrome/27.0.1453.90 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; en-us; SAMSUNG GT-I9200 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Version/1.0 Chrome/18.0.1025.308 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; zh-cn; SCH-I959 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Version/1.0 Chrome/18.0.1025.308 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; nl-nl; SM-T310 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.3; en-us; SAMSUNG SM-P600 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; GT-N5100 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; en-us; SAMSUNG SM-T530NU Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; CETUS)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; Focus I917 By TC)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; Focus i917)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; FOCUS S)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; GT-I8350)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; GT-i8700)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; GT-S7530)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; Hljchm\'s Wp)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; I917)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; OMNIA 7)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; OMNIA7 By MWP_HS)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; OMNIA7)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; OMNIA7; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i677)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i917)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i917.)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i917R)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i937)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SMG-917R)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG_blocked_blocked_blocked; OMNIA7; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG_blocked_blocked_blocked_blocked; OMNIA7; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SUMSUNG; OMNIA 7)' => array('isMobile' => true, 'isTablet' => false), - - ), - - 'simvalley' => array( - - 'Mozilla/5.0 (Linux; U; Android 2.3.4; de-de; SP-80 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - - ), - - 'Sony' => array( - 'SonyEricssonK800i/R1AA Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.1-update1; es-ar; SonyEricssonE15a Build/2.0.1.A.0.47) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.1-update1; pt-br; SonyEricssonU20a Build/2.1.1.A.0.6) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-au; SonyEricssonX10i Build/3.0.1.G.0.75) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; ru-ru; SonyEricssonST18i Build/4.0.2.A.0.62) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; hr-hr; SonyEricssonST15i Build/4.0.2.A.0.62) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; sk-sk; SonyEricssonLT15i Build/4.0.2.A.0.62) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; th-th; SonyEricssonST27i Build/6.0.B.3.184) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; de-de; SonyEricssonST25i Build/6.0.B.3.184) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; pt-br; Xperia Tablet S Build/TID0092) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'TID0092', 'Webkit' => '534.30', 'Safari' => '4.0') ), - 'Mozilla/5.0 (Linux; Android 4.0.3; LT18i Build/4.1.A.0.562) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; Sony Tablet S Build/TISU0R0110) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; es-es; Sony Tablet S Build/TISU0143) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; SonyEricssonLT18i Build/4.1.B.0.587) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; fr-ch; SonyEricssonSK17i Build/4.1.B.0.587) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; SonyEricssonLT26i Build/6.1.A.2.45) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; LT22i Build/6.1.B.0.544) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; vi-vn; SonyEricssonLT22i Build/6.1.B.0.544) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; ST23i Build/11.0.A.5.5) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; ST23i Build/11.0.A.2.10) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; LT28h Build/6.1.E.3.7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; SGPT13 Build/TJDS0170) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; ja-jp; SonySO-03E Build/10.1.E.0.265) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.2', 'Build' => '10.1.E.0.265', 'Webkit' => '534.30', 'Safari' => '4.0') ), - 'Mozilla/5.0 (Linux; Android 4.1.2; LT26w Build/6.2.B.1.96) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; SGP321 Build/10.3.1.A.0.33) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => '10.3.1.A.0.33', 'Webkit' => '537.31', 'Chrome' => '26.0.1410.58') ), - - 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; XL39h Build/14.2.A.1.136) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; sv-se; C5503 Build/10.1.1.A.1.273) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; C5502 Build/10.1.1.A.1.310) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; SonyL39t Build/14.1.M.0.202) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; L39u Build/14.1.n.0.63) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; zh-tw; M35c Build/12.0.B.5.37) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; M35c Build/12.0.B.2.42) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; zh-CN; M35t Build/12.0.C.2.42) AppleWebKit/534.31 (KHTML, like Gecko) UCBrowser/9.3.2.349 U3/0.8.0 Mobile Safari/534.31' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; D6502 Build/17.1.A.2.69) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; D6503 Build/17.1.A.0.504) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; D6543 Build/17.1.A.2.55) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D2004 Build/20.0.A.0.29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; en-gb; D2005 Build/20.0.A.1.12) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D2104 Build/20.0.B.0.84) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D2105 Build/20.0.B.0.74) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.170 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; pt-br; D2114 Build/20.0.B.0.85) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D2302 Build/18.0.B.1.23) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; S50h Build/18.0.b.1.23) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.6.3.413 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D2303 Build/18.0.C.1.13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D2305 Build/18.0.A.1.30) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D2306 Build/18.0.C.1.7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D5303 Build/19.0.1.A.0.207) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; D5306 Build/19.1.A.0.264) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; zh-CN; XM50h Build/19.0.D.0.269) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.7.6.428 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; XM50t Build/19.0.C.2.59) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D5322 Build/19.0.D.0.253) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; M51w Build/14.2.A.1.146) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; M51w Build/14.2.A.1.146) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.1; D5102 Build/18.2.A.0.9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.1; D5103 Build/18.1.A.0.11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.1; D5106 Build/18.1.A.0.11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; en-gb; C6902 Build/14.2.A.1.136) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 GSA/3.2.17.1009776.arm' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; es-es; C6943 Build/14.1.G.2.257) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; C6943 Build/14.3.A.0.681) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; SGP412 Build/14.1.B.3.320) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - - 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; SonySGP321 Build/10.2.C.0.143) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.2; SGP351 Build/10.1.1.A.1.307) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.3; SGP341 Build/10.4.B.0.569) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; SGP511 Build/17.1.A.2.36) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; SGP512 Build/17.1.A.2.36) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; fr-ch; SGP311 Build/10.1.C.0.344) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; SGP312 Build/10.1.C.0.344) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.4.2; de-de; SGP521 Build/17.1.A.2.69) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Safari/537.16' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.4.2; zh-cn; SGP541 Build/17.1.A.2.36) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; SGP551 Build/17.1.A.2.72) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - - 'SonyEricssonU5i/R2CA; Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 Safari/525' => array('isMobile' => true, 'isTablet' => false), - 'SonyEricssonU5i/R2AA; Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 Safari/525' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/4.0 (PDA; PalmOS/sony/model prmr/Revision:1.1.54 (en)) NetFront/3.0' => array('isMobile' => true, 'isTablet' => false), - 'Opera/9.80 (Linux mips; U; InettvBrowser/2.2 (00014A;SonyDTV115;0002;0100) KDL40EX720; CC/BEL; en) Presto/2.7.61 Version/11.00' => array('isMobile' => false, 'isTablet' => false), - 'Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11' => array('isMobile' => false, 'isTablet' => false), - ), - - 'Skk' => array('Mozilla/5.0 (Linux; U; Android 4.1; en-us; CYCLOPS Build/F10) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true)), - - 'Storex' => array( - 'Mozilla/5.0 (Linux; Android 4.1.1; eZee_Tab903 Build/JRO03H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03H', 'Webkit' => '537.36')), - "Mozilla/5.0 (Linux; Android 4.1.1; eZee'Tab785 Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Safari/537.36" => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03C', 'Webkit' => '537.36')), - "Mozilla/5.0 (Linux; Android 4.0.3; eZee'Tab971 Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19" => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'IML74K', 'Webkit' => '535.19')), - ), - - 'Tecno' => array('Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; TECNO P9 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true)), - - 'Telstra' => array( - 'Mozilla/5.0 (Linux; U; Android 2.3.7; en-au; T-Hub2 Build/TVA301TELBG3) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - ), - - // @info: http://www.texet.ru/tablet/ - 'texet' => array( - - 'Mozilla/5.0 (Linux; U; Android 2.3.4; ru-ru; TM-7021 Build/GB.m1ref.20120116) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '2.3.4', 'Webkit' => '533.1', 'Safari' => '4.0'), 'model' => 'TM-7021' ), - - ), - - 'Tolino' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 7 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39', 'Webkit' => '534.30', 'Safari' => '4.0')), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 8.9 Build/JDQ39) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39', 'Webkit' => '534.30', 'Safari' => '4.0')), - 'Mozilla/5.0 (Linux; Android 4.2.2; tolino tab 7 Build/JDQ39) AppleWebkit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36 OPR/18.0.1290.67495' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 7 Build/JDQ39) AppleWebkit/537.36 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Toshiba' => array( - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; TOSHIBA; TSUNAGI)' => array('isMobile' => true, 'isTablet' => false), - // @ref: http://www.toshiba.co.uk/discontinued-products/folio-100/ - 'Mozilla/5.0 (Linux; U; Android 2.2; it-it; TOSHIBA_FOLIO_AND_A Build/TOSHIBA_FOLIO_AND_A) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '2.2', 'Webkit' => '533.1', 'Safari' => '4.0') ), - ), - - 'Trekstor' => array( - 'Mozilla/5.0 (Linux; Android 4.2.2; ST70408-1 Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39', 'Webkit' => '537.31', 'Chrome' => '26.0.1410.58')), - 'Mozilla/5.0 (Linux; Android 4.2.2; VT10416-2 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true - ), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ST10216-2A Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30;SurfTab_10.1' => array( - 'isMobile' => true, 'isTablet' => true - ), - ), - - 'Visture' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; V97 HD Build/LR-97JC) Apple WebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; Visture V4 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; Visture V4 HD Build/Visture V4 HD) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; es-es; Visture V5 HD Build/Visture V5 HD) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; Visture V10 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Versus' => array( - 'Mozilla/5.0 (Linux; Android 4.0.4; VS-TOUCHPAD 9 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; Versus Touchpad 9.7 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-gb; CnM-TOUCHPAD7 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 BMID/E67A45B1AB' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; CnM TouchPad 7DC Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 TwonkyBeamBrowser/3.3.5-95 (Android 4.1.1; rockchip CnM TouchPad 7DC Build/meizhi_V2.80.wifi8723.20121225.b11c800)' => array('isMobile' => true, 'isTablet' => true), - 'OneBrowser/3.5/Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; TOUCHPAD 7 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; TOUCHTAB Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03H', 'Webkit' => '534.30', 'Safari' => '4.0') ), - ), - - 'Viewsonic' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; ViewPad 10e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.2; it-it; ViewPad7 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' =>array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.2.1; en-ca; ViewSonic VB733 Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 3.2; en-gb; ViewPad7X Build/HTJ85B) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.2; pt-br; ViewPad 10S Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; VB100a Pro Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Vodafone' => array( - 'Mozilla/5.0 (Linux; U; Android 3.2; hu-hu; SmartTab10-MSM8260-V02d-Dec022011-Vodafone-HU) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.3; SmartTabII10 Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; fr-fr; SmartTAB 1002 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Vonino' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Sirius_Evo_QS Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Q8 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - - ), - - 'Xoro' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; PAD 9720QR Build/PAD 9719QR) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; PAD720 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => true) - ), - - 'ZTE' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.1;zh-cn; ZTE V987 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30;' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; pt-pt; Blade Build/tejosunhsine) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; ZTE; N880e_Dawoer_Fulllock; China Telecom)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; ZTE; V965W)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; ZTE; Windows Phone - Internet 7; SFR)' => array('isMobile' => true, 'isTablet' => false), - ), - - 'Zync' => array( - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us ; Z909 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1/UCBrowser/8.4.1.204/145/444' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Console' => array( - - //Nintendo Wii: - 'Mozilla/5.0 (Nintendo WiiU) AppleWebKit/534.52 (KHTML, like Gecko) NX/{Version No} NintendoBrowser/{Version No}.US' => array('isMobile' => false, 'isTablet' => false), - - //Sony PlayStation: - 'Mozilla/5.0 (PLAYSTATION 3 4.21) AppleWebKit/531.22.8 (KHTML, like Gecko)' => array('isMobile' => false, 'isTablet' => false), - - //Microsoft Xbox: - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Xbox)' => array('isMobile' => false, 'isTablet' => false), - // WTF? Must investigate. - //'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Xbox)' => array('isMobile' => false, 'isTablet' => false), - - ), - - 'Other' => array( - 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.102 Chrome/32.0.1700.102 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0 AlexaToolbar/psPCtGhf-2.2' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (X11; Linux ppc; rv:17.0) Gecko/20130626 Firefox/17.0 Iceweasel/17.0.7' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (X11; Linux) AppleWebKit/535.22+ Midori/0.4' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-us) AppleWebKit/535+ (KHTML, like Gecko) Version/5.0 Safari/535.20+ Midori/0.4' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.20 Safari/537.36 OPR/15.0.1147.18 (Edition Next)' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 5.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0' => array('isMobile' => false, 'isTablet' => false), - 'Opera/9.80 (Windows NT 5.2; WOW64) Presto/2.12.388 Version/12.14' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (X11; FreeBSD amd64; rv:14.0) Gecko/20100101 Firefox/14.0.1' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Win64; x64; Trident/6.0; Touch; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Tablet PC 2.0; MASMJS)' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; MANMJS)' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; MASMJS)' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch; MASMJS)' => array('isMobile' => false, 'isTablet' => false), - 'Opera/9.80 (Windows NT 6.2; WOW64; MRA 8.0 (build 5784)) Presto/2.12.388 Version/12.11' => array('isMobile' => false, 'isTablet' => false), - // IE 10 - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)' => array('isMobile' => false, 'isTablet' => false), - // IE 11 @todo: Trident(.*)rv.(\d+)\.(\d+) - 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko' => array('isMobile' => false, 'isTablet' => false), - - // TV - 'Mozilla/5.0 (Unknown; Linux armv7l) AppleWebKit/537.1+ (KHTML, like Gecko) Safari/537.1+ HbbTV/1.1.1 ( ;LGE ;NetCast 4.0 ;03.20.30 ;1.0M ;)' => array('isMobile' => false, 'isTablet' => false), - 'HbbTV/1.1.1 (;Panasonic;VIERA 2012;1.261;0071-3103 2000-0000;)' => array('isMobile' => false, 'isTablet' => false), - 'Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11' => array('isMobile' => false, 'isTablet' => false), - ), - - 'Generic' => array( - - 'Mozilla/5.0 (Linux; Android 4.0.3; ALUMIUM10 Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.1; en-us; JY-G3 Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; hu-hu; M758A Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; EVOTAB Build/IMM76I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Java/1.6.0_22' => array('isMobile' => false, 'isTablet' => false, 'version' => array('Java' => '1.6.0_22') ), - 'Opera/9.80 (Series 60; Opera Mini/6.5.29260/29.3417; U; ru) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), - 'Opera/9.80 (Android; Opera Mini/6.5.27452/29.3417; U; ru) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), - // New Opera - 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17 OPR/14.0.1025.52315' => array('isMobile' => false, 'isTablet' => false), - // Unknown yet - // Looks like Chromebook - 'Mozilla/5.0 (X11; CrOS armv7l 4920.83.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.103 Safari/537.36', - 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5', - 'Mozilla/5.0 (Linux; U; Android 4.1.2; fr-fr; GT-I9070 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - 'Opera/9.80 (Android 2.3.7; Linux; Opera Mobi/46154) Presto/2.11.355 Version/12.10', - 'Mozilla/5.0 (Linux; U; Android 4.0.3; it-it; DATAM819HD_C Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30', - 'Mozilla/5.0 (Linux; U; Android 4.0.3; nl-nl; SGPT12 Build/TID0142) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30', - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; cm_tenderloin Build/IMM76L; CyanogenMod-9) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30', - - 'Mozilla/5.0 (Linux; U; Android 4.1.1; fr-fr; A210 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30', // Acer Iconia Tab - 'Mozilla/5.0 (iPad; CPU OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B141 Safari/8536.25', - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-gb; GT-I8150 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1', - 'Mozilla/5.0 (iPad; CPU OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mercury/7.2 Mobile/10A523 Safari/8536.25', // Mercurio Browser - 'Opera/9.80 (Android 2.3.7; Linux; Opera Tablet/46154) Presto/2.11.355 Version/12.10', - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; sdk Build/MASTER) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30', // sdk - 'Mozilla/5.0 (Linux; U; Android 4.2; en-us; sdk Build/JB_MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', // sdk - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; GT-P7510 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30', - 'Opera/9.80 (X11; Linux zbov) Presto/2.11.355 Version/12.10', - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; TOUCHPAD 7 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', // 7" Verso Android tablet - 'Mozilla/5.0 (iPhone; U; CPU OS 4_2_1 like Mac OS X) AppleWebKit/532.9 (KHTML, like Gecko) Version/5.0.3 Mobile/8B5097d Safari/6531.22.7', - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-gb; SGPT12 Build/TID0142) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30', // sony xperia tablet s unforts - 'Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7498.US', - 'Mozilla/5.0 (Linux; U; Android 2.0.6_b1; ru-ru Build/ECLAIR) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17', // PocketBook IQ701 (tablet) - 'Mozilla/5.0 (Linux; Android 4.0.4; z1000 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19', // It is a tablet with calling - 'Mozilla/5.0 (Linux; Android 4.0.3; cm_tenderloin Build/GWK74) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19', // HP touch pad running android cyanogenmod - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; Android for Techvision TV1T808 Board Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1', // My device is tablet but its detected as phone - 'BlackBerry8520/5.0.0.592 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/136', - 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17', // its a lenovo tablet 2 with windows 8 pro - 'Mozilla/5.0 (Linux; U; Android 3.1; ru-ru; LG-V900 Build/HMJ37) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13', - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; HTC; Windows Phone 8S by HTC)', - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)', // MS Surface RT tablet actually! - 'Mozilla/5.0 (PLAYSTATION 3 4.11) AppleWebKit/531.22.8 (KHTML, like Gecko)', - 'Mozilla/5.0 (Linux; U; Android 3.2; ru-ru; V9S_V1.4) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13', // Wrong detection - 7-inch tablet was detected as a phone. Android 3.2.1, native browser - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)', // Nope, its a Microsoft Surface tablet running Windows RT (8) with MSIE 10 - 'Mozilla/5.0 (Linux; U; Android 2.2; es-es; Broncho N701 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1', // Tablet! - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)', // its a Microsoft surface rt (tablet) - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch; WebView/1.0)', - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; Next7P12 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', // Nextbook 7SE Tablet - 'Opera/9.80 (X11; Linux zbov) Presto/2.11.355 Version/12.10', // allview alldro speed tablet, android ics, opera mobile - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)', // Its a surface in portrait - 'Mozilla/5.0 (Linux; U; Android 2.3.6; es-es; SAMSUNG GT-S5830/S5830BUKT2 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1', - 'Mozilla/5.0 (Linux; U; Android 3.2.1; en-gb;HTC_Flyer_P512 Build/HTK75C) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13', - // Am ramas la pozitia: 207 - - // Android on Windows :) www.socketeq.com - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; full Android on Microsoft Windows, pad, pc, n*books Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30', - - // TV - 'Opera/9.80 (Linux mips; U; InettvBrowser/2.2 (00014A;SonyDTV115;0002;0100) KDL40EX720; CC/BEL; en) Presto/2.7.61 Version/11.00', - - 'Mozilla/5.0 (Android; Mobile; rv:18.0) Gecko/18.0 Firefox/18.0', - // Maxthon - 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.12 (KHTML, like Gecko) Maxthon/3.0 Chrome/18.0.966.0 Safari/535.12', - 'Opera/9.80 (Windows NT 5.1; U; Edition Yx; ru) Presto/2.10.289 Version/12.02', - 'Mozilla/5.0 (Linux; U; Android 4.2; en-us; sdk Build/JB_MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Windows Phone 6.5.3.5)', - 'PalmCentro/v0001 Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/Palm-D061; Blazer/4.5) 16;320x320', - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)', - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Microsoft; XDeviceEmulator)', - // @todo: research N880E - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; MAL; N880E; China Telecom)', - 'Opera/9.80 (Series 60; Opera Mini/7.0.29482/28.2859; U; ru) Presto/2.8.119 Version/11.10', - 'Opera/9.80 (S60; SymbOS; Opera Mobi/SYB-1202242143; U; en-GB) Presto/2.10.254 Version/12.00', - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-au; 97D Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30', - 'Opera/9.80 (Android; Opera Mini/7.0.29952/28.2647; U; ru) Presto/2.8.119 Version/11.10', - 'Opera/9.80 (Android; Opera Mini/6.1.25375/28.2555; U; en) Presto/2.8.119 Version/11.10', - 'Opera/9.80 (Mac OS X; Opera Tablet/35779; U; en) Presto/2.10.254 Version/12.00', - 'Mozilla/5.0 (Android; Tablet; rv:10.0.4) Gecko/10.0.4 Firefox/10.0.4 Fennec/10.0.4', - 'Mozilla/5.0 (Android; Tablet; rv:18.0) Gecko/18.0 Firefox/18.0', - 'Opera/9.80 (Linux armv7l; Maemo; Opera Mobi/14; U; en) Presto/2.9.201 Version/11.50', - 'Opera/9.80 (Android 2.2.1; Linux; Opera Mobi/ADR-1207201819; U; en) Presto/2.10.254 Version/12.00' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; sdk Build/JRO03E) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; Endeavour 1010 Build/ONDA_MID) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), // Blaupunkt Endeavour 1010 - 'Mozilla/5.0 (Linux; U; Android 4.0.4; de-de; Tablet-PC-4 Build/ICS.g08refem618.20121102) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Bot' => array( - 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), - 'grub-client-1.5.3; (grub-client-1.5.3; Crawl your own stuff with http://grub.org)' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), - 'Googlebot-Image/1.0' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), - 'Python-urllib/2.5' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), - 'facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/) - ), - -); +// Setup. +$includeBasePath = dirname(__FILE__) . '/providers/vendors'; +$list = array(); + +// Scan. +$dir = new DirectoryIterator($includeBasePath); +foreach ($dir as $fileInfo) { + if ($fileInfo->isDot()) { + continue; + } + $listNew = include $includeBasePath . '/' . $fileInfo->getFilename(); + if (is_array($listNew)) { + $list = array_merge($list, $listNew); + } +} + +return $list; diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/UserAgentTest.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/UserAgentTest.php index 77cbc753858..6aca913ae66 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/UserAgentTest.php +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/UserAgentTest.php @@ -1,37 +1,19 @@ * @license MIT License https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt * @link http://mobiledetect.net */ class UserAgentTest extends PHPUnit_Framework_TestCase { + protected $detect; protected static $ualist = array(); protected static $json; + public function setUp() + { + $this->detect = new Mobile_Detect; + } + public static function generateJson() { //in case this gets run multiple times @@ -43,6 +25,9 @@ class UserAgentTest extends PHPUnit_Framework_TestCase $jsonFile = dirname(__FILE__) . '/ualist.json'; $phpFile = dirname(__FILE__) . '/UA_List.inc.php'; + //currently stored as a PHP array + $list = include $phpFile; + //check recency of the file if (file_exists($jsonFile) && is_readable($jsonFile)) { //read the json file @@ -51,7 +36,7 @@ class UserAgentTest extends PHPUnit_Framework_TestCase //check that the hash matches $hash = isset($json['hash']) ? $json['hash'] : null; - if ($hash == sha1_file($phpFile)) { + if ($hash == sha1(serialize($list))) { //file is up to date, just read the json file self::$json = $json['user_agents']; @@ -59,6 +44,7 @@ class UserAgentTest extends PHPUnit_Framework_TestCase } } + //uses the UA_List.inc.php to generate a json file if (file_exists($jsonFile) && !is_writable($jsonFile)) { throw new RuntimeException("Need to be able to create/update $jsonFile from UA_List.inc.php."); @@ -68,8 +54,9 @@ class UserAgentTest extends PHPUnit_Framework_TestCase throw new RuntimeException("Insufficient permissions to create this file: $jsonFile"); } - //currently stored as a PHP array - $list = include $phpFile; + + + //print_r($list['Acer']); exit; $json = array(); @@ -107,7 +94,7 @@ class UserAgentTest extends PHPUnit_Framework_TestCase } //save the hash - $hash = sha1_file($phpFile); + $hash = sha1(serialize($list)); $json = array( 'hash' => $hash, 'user_agents' => $json @@ -149,8 +136,9 @@ class UserAgentTest extends PHPUnit_Framework_TestCase public function userAgentData() { - if (!count(self::$ualist)) + if (!count(self::$ualist)) { self::setUpBeforeClass(); + } return self::$ualist; } @@ -169,25 +157,24 @@ class UserAgentTest extends PHPUnit_Framework_TestCase } //setup - $md = new Mobile_Detect; - $md->setUserAgent($userAgent); + $this->detect->setUserAgent($userAgent); //is mobile? - $this->assertEquals($md->isMobile(), $isMobile); + $this->assertEquals($this->detect->isMobile(), $isMobile); //is tablet? - $this->assertEquals($md->isTablet(), $isTablet); + $this->assertEquals($this->detect->isTablet(), $isTablet, 'FAILED: ' . $userAgent . ' isTablet: ' . $isTablet); if (isset($version)) { foreach ($version as $condition => $assertion) { - $this->assertEquals($assertion, $md->version($condition), 'FAILED UA (version("'.$condition.'")): '.$userAgent); + $this->assertEquals($assertion, $this->detect->version($condition), 'FAILED UA (version("'.$condition.'")): '.$userAgent); } } //version property tests if (isset($version)) { foreach ($version as $property => $stringVersion) { - $v = $md->version($property); + $v = $this->detect->version($property); $this->assertSame($stringVersion, $v); } } @@ -196,7 +183,7 @@ class UserAgentTest extends PHPUnit_Framework_TestCase //@todo: vendor test. The below is theoretical, but fails 50% of the tests... /*if (isset($vendor)) { $method = "is$vendor"; - $this->assertTrue($md->{$method}(), "Expected Mobile_Detect::{$method}() to be true."); + $this->assertTrue($this->detect->{$method}(), "Expected Mobile_Detect::{$method}() to be true."); }*/ } } diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/VendorsTest.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/VendorsTest_tmp.php similarity index 60% rename from htdocs/includes/mobiledetect/mobiledetectlib/tests/VendorsTest.php rename to htdocs/includes/mobiledetect/mobiledetectlib/tests/VendorsTest_tmp.php index 06724144505..b2d7bf215d8 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/VendorsTest.php +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/VendorsTest_tmp.php @@ -1,29 +1,5 @@ * @license MIT License https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt * @link http://mobiledetect.net */ @@ -49,21 +25,21 @@ class VendorsTest extends PHPUnit_Framework_TestCase public function testisMobileIsTablet() { foreach (self::$items as $brand => $deviceArr) { - foreach ($deviceArr as $userAgent => $conditions) { - - if (!is_array($conditions)) { continue; } + if (!is_array($conditions)) { + continue; + } $this->detect->setUserAgent($userAgent); foreach ($conditions as $condition => $assert) { - // Currently not supporting version and model here. // @todo: I need to split this tests! - if ( in_array($condition, array('model') ) ) { continue; } // 'version', + if (in_array($condition, array('model'))) { + continue; + } // 'version', switch ($condition) { - case 'version': // Android, iOS, Chrome, Build, etc. foreach ($assert as $assertKey => $assertValue) { @@ -72,13 +48,11 @@ class VendorsTest extends PHPUnit_Framework_TestCase //} $this->assertTrue( $this->detect->$condition( $assertKey ) == $assertValue, 'UA ('.$condition.'('.$assertKey.') === '.$assertValue.'): '.$userAgent); } - - break; + break; default: - $this->assertTrue( $this->detect->$condition() === $assert, 'UA ('.$condition.'): '.$userAgent); - break; - + $this->assertTrue($this->detect->$condition() === $assert, 'UA ('.$condition.'): '.$userAgent); + break; } } diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/phpunit.xml b/htdocs/includes/mobiledetect/mobiledetectlib/tests/phpunit.xml index c780cebe223..2b10958d550 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/phpunit.xml +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/phpunit.xml @@ -1,15 +1,15 @@ + mapTestClassNameToCoveredClassName="true"> @@ -17,9 +17,11 @@ - ./ + ./ - + + + diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Acer.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Acer.php new file mode 100644 index 00000000000..d8fc582085f --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Acer.php @@ -0,0 +1,28 @@ + array( + 'Mozilla/5.0 (Linux; U; Android 3.2.1; en-us; A100 Build/HTK55D) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; A110 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; A200 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Webkit' => '534.30', 'Safari' => '4.0', 'Build' => 'IML74K'), 'model' => 'A200' ), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; A500 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; A501 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.1.1; A701 Build/JRO03H) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.1.2; B1-A71 Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.1.2; B1-710 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.2; A1-810 Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; nl-nl; A1-810 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Acer; Allegro)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; A3-A10 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true, 'version' => array( + 'Android' => '4.2.2', 'Build' => 'JDQ39', 'Webkit' => '537.36', 'Chrome' => '32.0.1700.99', + ), + ), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; A1-811 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; Android 4.2.2; A1-830 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; Android 4.2.2; A3-A11 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36'=> array('isMobile' => true, 'isTablet' => true) + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Alcatel.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Alcatel.php new file mode 100644 index 00000000000..96a36ac35e0 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Alcatel.php @@ -0,0 +1,49 @@ + array( + 'Mozilla/5.0 (Linux; U; Android 2.3.7; en-in; MB525 Build/GWK74; CyanogenMod-7.2.0) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.5; it-it; ALCATEL ONE TOUCH 918D Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '2.3.5', 'Webkit' => '533.1', 'Safari' => '4.0', 'Build' => 'GRJ90'), 'model' => 'ONE TOUCH 918D' ), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; ALCATEL ONE TOUCH 991 Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '2.3.6', 'Webkit' => '533.1', 'Safari' => '4.0', 'Build' => 'GRJ90'), 'model' => 'ONE TOUCH 991' ), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; ALCATEL ONE TOUCH 993D Build/ICECREAM) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.0.4', 'Webkit' => '534.30', 'Safari' => '4.0', 'Build' => 'ICECREAM'), 'model' => 'ONE TOUCH 993D' ), + 'ALCATEL_A392G/1.0 ObigoInternetBrowser/Q05A[TF013513002719521000000013182904148]' => array('isMobile' => true, 'isTablet' => false, 'model' => 'A392G'), + 'ALCATEL_3020D/1.0 ObigoInternetBrowser/Q03C' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2; ALCATEL ONE TOUCH 5037A Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'ALCATEL_3020G/1.0 ObigoInternetBrowser/Q03C' => array('isMobile' => true, 'isTablet' => false), + 'ALCATEL_3041D/1.0 ObigoInternetBrowser/Q03C' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 5037E Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 5037X Build/JDQ39) AppleWebKit/537.36 (KHTML like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 5037X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; ONE TOUCH 6012A Build/JDQ39) AppleWebKit/537.36 (KHTML like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-nz; ONE TOUCH 6012A Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; ONE TOUCH 6012D Build/JDQ39) AppleWebKit/537.36 (KHTML like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; ONE TOUCH 6012D Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; En-us; ONE TOUCH 6012E Build/JDQ39) AppleWebKit/534.30 (KHTML, Like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; ONE TOUCH 6012X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.12975 YaBrowser/13.12.1599.12975 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; bg-bg; ONE TOUCH 6012X Build/JDQ39) AppleWebKit/534.30 (KHTML like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 6012X_orange Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; fr-fr; ALCATEL ONE TOUCH 6012X_orange Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; fr-fr; 6016E Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; ALCATEL ONE TOUCH 6016E Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; 6016X Build/JLS36C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; ALCATEL ONE TOUCH 6016X Build/JLS36C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; ru-ru; 6016X Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 6032A Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.170 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; ru-ru; ALCATEL ONE TOUCH 6032X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-nz; ALCATEL ONE TOUCH 7040A Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; th-th; ALCATEL ONE TOUCH 7040D Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7040D Build/JDQ39) AppleWebKit/537.36 (KHTML like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7040E Build/JDQ39) AppleWebKit/537.36 (KHTML like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; it-it; ALCATEL ONE TOUCH 7041D Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7041D Build/JDQ39) AppleWebKit/537.36 (KHTML like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7041X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; pt-pt; ALCATEL ONE TOUCH 7041X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020A Build/JDQ39) AppleWebKit/537.36 (KHTML, Like Gecko) Chrome/30.0.1599.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 8020A Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020D Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; es-es; ALCATEL ONE TOUCH 8020D Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020E Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 8020E Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 8020X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Allview.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Allview.php new file mode 100644 index 00000000000..7bbcb5ea25d --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Allview.php @@ -0,0 +1,11 @@ + array( + + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; ALLVIEW P5 Build/IML74K) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us ; ALLVIEW SPEEDI Build/IMM76D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1/UCBrowser/8.5.3.246/145/355' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; AllviewCity Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; ALLVIEWSPEED Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Amazon.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Amazon.php new file mode 100644 index 00000000000..82fa5ac44d2 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Amazon.php @@ -0,0 +1,14 @@ + array( + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.4 Mobile Safari/535.19 Silk-Accelerated =true' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; en-US) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) Version/4.0 Kindle/3.0 (screen 600x800; rotate)' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Webkit' => '528.5+', 'Kindle' => '3.0', 'Safari' => '4.0'), 'model' => 'Kindle' ), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFOTE Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'IML74K', 'Webkit' => '534.30', 'Safari' => '4.0') ), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; WFJWAE Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.21 Safari/535.19 Silk-Accelerated=true' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; en-us; KFTHWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.21 Safari/535.19 Silk-Accelerated=true' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; en-us; KFJWI Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.21 Safari/535.19 Silk-Accelerated=true' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; en-us; KFSOWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.21 Safari/535.19 Silk-Accelerated=true' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 2.1; xx-xx; T720-WIFI Build/ECLAIR) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => true), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Apple.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Apple.php new file mode 100644 index 00000000000..931de962eba --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Apple.php @@ -0,0 +1,27 @@ + array( + 'iTunes/9.1.1' => array('isMobile' => false, 'isTablet' => false), + 'iTunes/11.0.2 (Windows; Microsoft Windows 8 x64 Business Edition (Build 9200)) AppleWebKit/536.27.1' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A4449d Safari/9537.53' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543 Safari/419.3' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Webkit' => '420+', 'Safari' => '3.0') ), + 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '3_0', 'Webkit' => '528.18', 'Safari' => '4.0'), 'model' => 'iPhone', 'mobileGrade' => 'B' ), + 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '5_1_1', 'Webkit' => '534.46', 'Mobile' => '9B206', 'Safari' => '5.1'), 'model' => 'iPhone' ), + 'Mozilla/5.0 (iPod; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '6_0', 'Webkit' => '536.26', 'Mobile' => '10A403', 'Safari' => '6.0'), 'model' => 'iPod'), + 'Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X; en-us) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/21.0.1180.80 Mobile/9B206 Safari/7534.48.3 (6FF046A0-1BC4-4E7D-8A9D-6BF17622A123)' => array('isMobile' => true, 'isTablet' => true, 'version' => array('iOS' => '5_1_1', 'Webkit' => '534.46.0', 'Chrome' => '21.0.1180.80', 'Mobile' => '9B206'), 'model' => 'iPad' ), + 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25' => array('isMobile' => true, 'isTablet' => true, 'version' => array('iOS' => '6_0', 'Webkit' => '536.26', 'Safari' => '6.0', 'Mobile' => '10A403'), 'model' => 'iPad' ), + 'Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5' => array('isMobile' => true, 'isTablet' => true, 'version' => array('iOS' => '4_2_1', 'Webkit' => '533.17.9', 'Safari' => '5.0.2', 'Mobile' => '8C148'), 'model' => 'iPad', 'mobileGrade' => 'B' ), + 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10' => array('isMobile' => true, 'isTablet' => true, 'version' => array('iOS' => '3_2', 'Webkit' => '531.21.10', 'Safari' => '4.0.4', 'Mobile' => '7B334b'), 'model' => 'iPad', 'mobileGrade' => 'B' ), + 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X; da-dk) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/21.0.1180.82 Mobile/10A523 Safari/7534.48.3' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '6_0_1', 'Webkit' => '534.46.0', 'Chrome' => '21.0.1180.82', 'Mobile' => '10A523'), 'model' => 'iPhone', 'mobileGrade' => 'A' ), + 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A523 Safari/8536.25' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '6_0_1', 'Webkit' => '536.26', 'Safari' => '6.0', 'Mobile' => '10A523'), 'model' => 'iPhone', 'mobileGrade' => 'A' ), + 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X; ru-ru) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/23.0.1271.100 Mobile/10B142 Safari/8536.25' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '6_1', 'Webkit' => '536.26', 'Chrome' => '23.0.1271.100', 'Mobile' => '10B142'), 'model' => 'iPhone', 'mobileGrade' => 'A' ), + 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '6_1_3', 'Webkit' => '536.26', 'Safari' => '6.0', 'Mobile' => '10B329'), 'model' => 'iPhone', 'mobileGrade' => 'A' ), + 'Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Coast/1.0.2.62956 Mobile/10B329 Safari/7534.48.3' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Coast' => '1.0.2.62956')), + 'CheckMyBus iOS mobile App 0.9.0 (iPhone; iPhone OS/7.1.1)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/38.0.2125.59 Mobile/12A405 Safari/600.1.4' => array('isMobile' => true, 'isTablet' => false), + 'VendorAppName/1.7.0 (iPhone; iOS 8.1.2; Scale/3.00)' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '8.1.2'), 'model' => 'iPhone', 'mobileGrade' => 'A' ), + 'Mozilla/5.0 (iPad; CPU OS 9_0 like Mac OS X) AppleWebKit/601.1.17 (KHTML, like Gecko) Version/8.0 Mobile/13A175 Safari/600.1.4' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.37 (KHTML, like Gecko) Version/8.0 Mobile/13A4293g Safari/600.1.4' => array('isMobile' => true, 'isTablet' => false), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Archos.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Archos.php new file mode 100644 index 00000000000..3fda3c9ab9c --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Archos.php @@ -0,0 +1,67 @@ + array( + + 'Mozilla/5.0 (Linux; Android 4.2.2; Qilive 97R Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.1.2; Archos 50 Platinum Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.4; ARCHOS 80G9 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 2.2.1; fr-fr; A101IT Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.2; Archos 101 Neon Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true + ), + 'Mozilla/5.0 (Linux; Android 4.2.2; Archos 101 Cobalt Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 80 TITANIUM Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; Android 4.1.1; ARCHOS 101 Titanium Build/JRO03H) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 70b TITANIUM Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; de-de; Archos 80 Xenon Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; Android 4.2.2; Archos 79 Xenon Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 101 Titanium Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 80XSK Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS FAMILYPAD 2 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; Android 4.1.1; ARCHOS 97B TITANIUM Build/JRO03H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; Android 4.2.2; ARCHOS 101 XS 2 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; ARCHOS 80b PLATINUM Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; Android 4.2.2; Archos 70 Xenon Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; ARCHOS 97 CARBON Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 97 TITANIUMHD Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; Android 4.2.2; Archos 90 Neon Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 1.6; de-de; Archos5 Build/Donut) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS GAMEPAD Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Asus.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Asus.php new file mode 100644 index 00000000000..5d817e34a94 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Asus.php @@ -0,0 +1,22 @@ + array( + 'Mozilla/5.0 (Linux; U; Android 3.2.1; en-us; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '3.2.1', 'Webkit' => '534.13', 'Safari' => '4.0'), 'model' => 'Transformer TF101' ), + 'Mozilla/5.0 (Linux; Android 4.1.1; Transformer Build/JRO03L) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.1.1; ASUS Transformer Pad TF300T Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; fr-fr; Transformer Build/JZO54K; CyanogenMod-10) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; asus_laptop Build/IMM76L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; PadFone 2 Build/JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; PadFone 2 Build/JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03L', 'Webkit' => '534.30', 'Safari' => '4.0') ), + 'Mozilla/5.0 (Linux; Android 4.2.1; ME301T Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.1', 'Build' => 'JOP40D') ), + 'Mozilla/5.0 (Linux; Android 4.2.1; ME173X Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.1', 'Build' => 'JOP40D') ), + 'Mozilla/5.0 (Linux; Android 4.2.2; TF300T Build/JDQ39E) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39E') ), + 'Mozilla/5.0 (Linux; Android 4.2.2; K00C Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.2; K00E Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.2; K00F Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.2; K00L Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.2; ME302KL Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; K010 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; K017 Build/KVT49L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Blackberry.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Blackberry.php new file mode 100644 index 00000000000..7f1c106e47d --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Blackberry.php @@ -0,0 +1,35 @@ + array( + 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9300; en) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.546 Mobile Safari/534.8+' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Webkit' => '534.8+', 'BlackBerry' => '6.0.0.546'), 'model' => 'BlackBerry 9300' ), + 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9360; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.400 Mobile Safari/534.11+' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9700; he) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.723 Mobile Safari/534.8+' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9700; en-US) AppleWebKit/534.8 (KHTML, like Gecko) Version/6.0.0.448 Mobile Safari/534.8' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9790; en-GB) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.714 Mobile Safari/534.11+' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Webkit' => '534.11+', 'BlackBerry' => '7.1.0.714'), 'model' => 'BlackBerry 9790' ), + 'Opera/9.80 (BlackBerry; Opera Mini/7.0.29990/28.2504; U; en) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9981; en-GB) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.342 Mobile Safari/534.11+' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en-GB) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.546 Mobile Safari/534.8+' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9780; es) AppleWebKit/534.8 (KHTML, like Gecko) Version/6.0.0.480 Mobile Safari/534.8' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9810; en-US) AppleWebKit/534.11 (KHTML, like Gecko) Version/7.0.0.583 Mobile Safari/534.11' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9860; es) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.576 Mobile Safari/534.11+' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit/534.11 (KHTML, like Gecko) Version/7.1.0.523 Mobile Safari/534.11' => array('isMobile' => true, 'isTablet' => false), + 'BlackBerry8520/5.0.0.592 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/136' => array('isMobile' => true, 'isTablet' => false), + 'BlackBerry8520/5.0.0.1067 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/603' => array('isMobile' => true, 'isTablet' => false), + 'BlackBerry8520/5.0.0.1036 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/611' => array( 'isMobile' => true, 'isTablet' => false, 'version' => array('BlackBerry' => '5.0.0.1036', 'VendorID' => '611'), 'model' => 'BlackBerry8520' ), + 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9220; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.337 Mobile Safari/534.11+' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML, like Gecko) Version/7.2.1.0 Safari/536.2+' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.1+ (KHTML, like Gecko) Version/10.0.0.1337 Mobile Safari/537.1+' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (BB10; Touch) /537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+' => array( 'isMobile' => true, 'isTablet' => false, 'version' => array('BlackBerry' => '10.0.9.2372') ), + 'Mozilla/5.0 (Linux; U; Android 3.2.1; en-us; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '3.2.1', 'Webkit' => '534.13', 'Safari' => '4.0'), 'model' => 'Transformer TF101' ), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; A200 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Webkit' => '534.30', 'Safari' => '4.0'), 'model' => 'A200' ), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; A500 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Webkit' => '534.30', 'Safari' => '4.0'), 'model' => 'A500' ), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; A501 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Webkit' => '534.30', 'Safari' => '4.0'), 'model' => 'A501' ), + 'Mozilla/5.0 (Linux; Android 4.1.1; Transformer Build/JRO03L) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Webkit' => '535.19', 'Chrome' => '18.0.1025.166'), 'model' => 'Transformer' ), + 'Mozilla/5.0 (Linux; Android 4.1.1; ASUS Transformer Pad TF300T Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Webkit' => '535.19', 'Chrome' => '18.0.1025.166'), 'model' => 'Transformer Pad TF300T' ), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; fr-fr; Transformer Build/JZO54K; CyanogenMod-10) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.2', 'Webkit' => '534.30', 'Safari' => '4.0', 'Build' => 'JZO54K'), 'model' => 'Transformer' ), + 'Mozilla/5.0 (Linux; Android 4.1.2; B1-A71 Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.2', 'Webkit' => '535.19', 'Chrome' => '18.0.1025.166'), 'model' => 'B1-A71' ), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Acer; Allegro)' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Windows Phone OS' => '7.5', 'Trident' => '5.0', 'IE' => '9.0'), 'model' => 'Allegro' ), + ), + +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Dell.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Dell.php new file mode 100644 index 00000000000..2c94b9728a1 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Dell.php @@ -0,0 +1,13 @@ + array( + 'Mozilla/5.0 (Linux; U; Android 1.6; en-gb; Dell Streak Build/Donut AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/ 525.20.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.7; hd-us; Dell Venue Build/GWK74; CyanogenMod-7.2.0) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; DELL; Venue Pro)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; Venue 8 3830 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; Venue 7 3730 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; Venue 7 HSPA+ Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; Venue 8 3830 Build/JSS15Q) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 3.2; zh-cn; Dell Streak 10 Pro Build/HTJ85B) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Google.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Google.php new file mode 100644 index 00000000000..688653304cd --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Google.php @@ -0,0 +1,18 @@ + array( + 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; Nexus 4 Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.40 Mobile Safari/537.31 OPR/14.0.1074.54070' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39', 'Webkit' => '537.31', 'Opera' => '14.0.1074.54070') ), + 'Mozilla/5.0 (Linux; Android 4.2.2; Nexus 4 Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.2.2', 'Chrome' => '26.0.1410.58')), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; Google Nexus 4 - 4.1.1 - API 16 - 768x1280 Build/JRO03S) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; Google Galaxy Nexus - 4.1.1 - API 16 - 720x1280 Build/JRO03S) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2; Nexus 7 Build/JOP40C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.1.2; Nexus 7 Build/JZ054K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.2', 'Chrome' => '18.0.1025.166') ), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; cs-cz; Nexus S Build/JZO54K; CyanogenMod-10.0.0) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; Nexus 10 Build/JWR66Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android; en_us; Nexus 7 Build/) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 NetFrontLifeBrowser/2.3 Mobile (Dragonfruit)' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 5.1; Nexus 5 Build/LMY47D) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36 momoWebView/6.3.1 android/404(Nexus 5;android 5.1;zh_CN;10;netType/1)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; Nexus 10 Build/JWR66Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HP.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HP.php new file mode 100644 index 00000000000..4f8b14a8217 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HP.php @@ -0,0 +1,21 @@ + array( + 'Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.5; U; en-GB) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.83 Safari/534.6 TouchPad/1.0' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; HP Slate 7 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.1.1; HP Slate 7 Build/JRO03H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; HP 8 Build/1.0.7_WW-FIR-13) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.2; HP Slate 10 HD Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true + ), + 'Mozilla/5.0 (Linux; Android 4.4.2; HP Slate 8 Pro Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true + ), + 'Mozilla/5.0 (Linux; Android 4.2.2; Slate 21 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Safari/537.36 OPR/22.0.1485.78487' => array( + 'isMobile' => true, 'isTablet' => true + ), + 'Mozilla/5.0 (Linux; Android 4.3; HP SlateBook 10 x2 PC Build/4.3-17r20-03-23) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true + ), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HTC.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HTC.php new file mode 100644 index 00000000000..cf6caebacc1 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HTC.php @@ -0,0 +1,363 @@ + array( + 'Mozilla/5.0 (X11; Linux x86_64; Z520m; en-ca) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24' => array('isMobile' => true, 'isTablet' => false), + 'HTC_Touch_HD_T8282 Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 1.5; en-us; ADR6200 Build/CUPCAKE) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.1; xx-xx; Desire_A8181 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.1-update1; de-de; HTC Desire 1.19.161.5 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.1-update1; en-gb; HTC Desire Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.2; fr-fr; HTC Desire Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.2; en-dk; Desire_A8181 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.2; xx-xx; 001HT Build/FRF91) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.2; xx-xx; HTCA8180/1.0 Android/2.2 release/06.23.2010 Browser/WAP 2.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.2.2; de-at; HTC Desire Build/FRG83G) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.2.2; en-sk; Desire_A8181 Build/FRG83G) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3; xx-xx; HTC/DesireS/1.07.163.1 Build/GRH78C) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-lv; HTC_DesireZ_A7272 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; ADR6300 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.5; en-gb; HTC/DesireS/2.10.161.3 Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC_DesireS_S510e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; Inspire 4G Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.5; de-de; HTC Explorer A310e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.5; en-gb; HTC_ChaCha_A810e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.5; nl-nl; HTC_DesireHD_A9191 Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC Desire S Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-au; HTC Desire Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.5; de-de; HTC_DesireHD Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ua; HTC_WildfireS_A510e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; HTC Vision Build/GRI40; ILWT-CM7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; HTC_GOF_U/1.05.161.1 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; hu-hu; HTC Sensation Z710e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; HTC Sensation XE with Beats Audio Z715e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; pl-pl; EVO3D_X515m Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; HTC_One_S Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; HTC_One_V Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; HTC_A320e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; zh-tw; HTC Desire V Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; PG86100 Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-nl; SensationXE_Beats_Z715e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; ADR6425LVW 4G Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; cs-ee; Sensation_Z710e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; HTC Evo 4G Build/MIUI) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.4; Desire HD Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-my; HTC_One_X Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; it-it; IncredibleS_S710e Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; fr-fr; HTC_Desire_S Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC Butterfly Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; EVO Build/JRO03C) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; HTCSensation Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; GT-S6312 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC 7 Mozart T8698; QSD8x50)' => array( + 'isMobile' => true, 'isTablet' => false, 'version' => array('IE' => '9.0', 'Windows Phone OS' => '7.5', 'Trident' => '5.0'), 'model' => '7 Mozart T8698', + ), + 'Mozilla/5.0 (Linux; U; Android 3.2.1; en-gb;HTC_Flyer_P512 Build/HTK75C) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), + + 'Mozilla/5.0 (Linux; U; Android 3.1; zh-tw; HTC PG09410 Build/HMJ15) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), + + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 HTC MOZART)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Mondrian T8788)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Mozart T8698)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Mozart)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Mozart; Orange)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Pro T7576)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Pro)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Schubert T9292)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Surround)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Trophy T8686)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Trophy)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Eternity)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Gold)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; HD2 LEO)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; HD2)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; HD7 T9292)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; HD7)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; iPad 3)' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; LEO)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Mazaa)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Mondrian)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Mozart T8698)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Mozart)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; mwp6985)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; PC40100)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; PC40200)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; PD67100)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; PI39100)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; PI86100)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar 4G)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar C110e)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar C110e; 1.08.164.02)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar C110e; 2.05.164.01)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar C110e; 2.05.168.02)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar; Orange)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Schuber)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Schubert T9292)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Schubert)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Spark)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Surround)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; T7575)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; T8697)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; T8788)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; T9295)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; T9296)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; TITAN X310e)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Torphy T8686)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; X310e)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC_blocked; T8788)' => array( + 'isMobile' => true, 'isTablet' => false, 'version' => array('IE' => '9.0', 'Windows Phone OS' => '7.5', 'Trident' => '5.0'), 'model' => 'T8788', + ), + + 'Mozilla/5.0 (Linux; Android 4.0.4; HTC One S Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; de-de; HTC One X Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-th; HTC One V Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.4; HTC One X Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-id; HTC One X Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One S Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One X Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-at; HTC One S Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03L) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; HTC One S Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One X Build/JZO54K) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; es-pe; HTC One V Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; HTC One X Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 Maxthon/4.0.4.1000' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One X Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19 AlexaToolbar/alxf-2.17' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One Build/JZO54K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One S Build/IML74K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; de-de; HTC One Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 OPR/14.0.1074.58201' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; es-es; HTC One S Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.64 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.64 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.64 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39E) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One XL Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Mobile Safari/537.36 OPR/15.0.1162.60140' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; HTC One S Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One X Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.24 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'HTC One X Linux/3.0.13 Android/4.1.9 Release/10.12.2012 Browser/AppleWebKit534.30 Profile/MIDP-2.0 Configuration/CLDC-1.1 Mobile Safari/534.30 Android 4.0.1;' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-tw; HTC One 801e Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.4; HTC One X Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Mobile Safari/537.36 OPR/15.0.1162.61541' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One XL Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X+ Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; HTC One X Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30/4.05d.1002.m7' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-in; HTC One V Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; HTC One X Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 MicroMessenger/5.0.1.352' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; HTC One X Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; HTC One Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One SV Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One mini Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; HTC One Build/IMM76D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One 801e Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-ch; HTC One Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; nl-nl; HTC One X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; HTC One S Build/IML74K) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17 T5/2.0 baidubrowser/3.1.6.4 (Baidu; P1 4.0.3)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X+ Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; HTC One 801e Build/JSS15J) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.4.1.362 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4; HTC One Build/KRT16S.H5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One SV Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.1; ru-ru; HTC One Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; ru-ru; HTC One 801e Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One 801e Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One mini Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.12975 YaBrowser/13.12.1599.12975 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4; HTC One Build/KRT16S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; HTC One Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One X Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JWR66Y.H1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.93 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; de-at; HTC One Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X+ Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One dual sim Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.4; HTC One S Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One max Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.132 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One mini Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One 801e Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; HTC One Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 MicroMessenger/5.2.380' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One X Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X+ Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.132 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.4; HTC One X Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; it-it; HTC One S Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-kw; HTC One X+ Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One max Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 MicroMessenger/5.3.0.49_r693790.420' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru; HTC One V Build/IML74K) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.7.5.418 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 MicroMessenger/5.2.1.381' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One mini Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.4.2; ru-ru; HTC One mini Build/KOT49H) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.16' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru; HTC One V Build/IML74K) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.8.0.435 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One 801e Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; HTC One X - 4.2.2 - API 17 - 720x1280 Build/JDQ39E) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X+ Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.128 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.128 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.128 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One_M8 Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One VX Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.76 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One dual sim Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One dual sim Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36 OPR/22.0.1485.78487' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X+ Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One_M8 Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One 801e Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One 801e Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One X Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36 OPR/22.0.1485.81203' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One 801e Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One mini Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-tw; HTC One S Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One_M8 Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; HTC One V Build/IML74K) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.9.2.467 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One mini Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; HTC One_M8 Build/KOT49H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One dual sim Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.72 Mobile Safari/537.36 OPR/19.0.1340.69721' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One_M8 Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One SV Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 ACHEETAHI/2100050056' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.4; HTC One_M8 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One_M8 Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JWR66Y.H1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-tw; HTC One SV Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One mini Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.4; HTC One_M8 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 [FBAN/FB4A;FBAV/21.0.0.23.12;]' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-tw; HTC One X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.4; HTC One_M8 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; ru-si; HTC One X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 MicroMessenger/6.0.0.67_r853700.483 NetType/WIFI' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 [FBAN/FB4A;FBAV/22.0.0.15.13;]' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-US; HTC One X Build/JRO03C) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/10.0.1.512 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.4; HTC One Build/KTU84P.H1) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 [FBAN/FB4A;FBAV/22.0.0.15.13;]' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One mini Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 [FBAN/FB4A;FBAV/22.0.0.15.13;]' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One SV Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.4; HTC One_M8 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 [FBAN/FB4A;FBAV/22.0.0.15.13;]' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-tw; HTC One X+ Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.4; HTC One_M8 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 BingWeb/5.2.0.20140710' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; es-mx; HTC One S Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 [FBAN/FB4A;FBAV/23.0.0.22.14;]' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One mini Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.4.3; es-es; HTC One 801e Build/KTU84L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One mini Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X+ Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.69 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; HTC One S Build/JRO03C) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.16' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/24.0.0.30.15;]' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-th; HTC One Build/KOT49H) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.16' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; es-ar; HTC One X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 [FB_IAB/FB4A;FBAV/24.0.0.30.15;]' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/24.0.0.30.15;]' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; es-us; HTC One X+ Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 [FB_IAB/FB4A;FBAV/24.0.0.30.15;]' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; es-mx; HTC One S Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 [FB_IAB/FB4A;FBAV/24.0.0.30.15;]' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/24.0.0.30.15;]' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.89 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One dual sim Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.89 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/25.0.0.19.30;]' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 5.0.1; HTC One_M8 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/25.0.0.19.30;]' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.89 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.4; HTC One_M8 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One mini Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 5.0.1; HTC One_M8 Build/LRX22C.H5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Huawei.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Huawei.php new file mode 100644 index 00000000000..f5ffca8e568 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Huawei.php @@ -0,0 +1,17 @@ + array( + 'Mozilla/5.0 (Linux; U; Android 2.1-update1; bg-bg; Ideos S7 Build/ERE27) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Ideos S7 Build/ERE27) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; lt-lt; U8660 Build/HuaweiU8660) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.7; ru-ru; HUAWEI-U8850 Build/HuaweiU8850) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 3.2; pl-pl; MediaPad Build/HuaweiMediaPad) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 3.2; nl-nl; HUAWEI MediaPad Build/HuaweiMediaPad) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), + 'HUAWEI_T8951_TD/1.0 Android/4.0.4 (Linux; U; Android 4.0.4; zh-cn) Release/05.31.2012 Browser/WAP2.0 (AppleWebKit/534.30) Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; ar-eg; MediaPad 7 Youth Build/HuaweiMediaPad) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; zh-cn; HW-HUAWEI_C8815/C8815V100R001C541B135; 540*960; CTC/2.0) AppleWebKit/534.30 (KHTML, like Gecko) Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; HW-HUAWEI_C8813D/C8813DV100R001C92B172; 480*854; CTC/2.0) AppleWebKit/534.30 (KHTML, like Gecko) Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; HW-HUAWEI_Y300C/Y300CV100R001C92B168; 480*800; CTC/2.0) AppleWebKit/534.30 (KHTML, like Gecko) Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false) + ), + +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/LG.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/LG.php new file mode 100644 index 00000000000..1b0bc7dd767 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/LG.php @@ -0,0 +1,35 @@ + array( + 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; LG-VS410PP Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; LG-P509 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.2.2; pt-br; LG-P350f Build/FRG83G) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; LG-P500 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; LS670 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.4; ru-ru; LG-E510 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; VS910 4G Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; nl-nl; LG-P700 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; LG-F160S Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; nl-nl; LG-E610v/V10f Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; LG-E612 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; LG-F180K Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; LG-V500 Build/JDQ39B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; LG-LW770 Build/IMM76I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; LG-V510 Build/KOT49H.L004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG E-900)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-C900)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-C900k)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-E900)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-E900; Orange)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-E900h)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-Optimus 7)' => array('isMobile' => true, 'isTablet' => false), + // @ref: http://ja.wikipedia.org/wiki/L-06C + 'Mozilla/5.0 (Linux; U; Android 3.0.1; ja-jp; L-06C Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 3.0; en-us; LG-V900 Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-gb; LG-V700 Build/KOT49I.A1403851714) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.1599.103 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; LG-V500 Build/KOT49I.V50020d) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LG-V410/V41010d Build/KOT49I.V41010d) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.1599.103 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lava.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lava.php new file mode 100644 index 00000000000..95c37868842 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lava.php @@ -0,0 +1,23 @@ + array( + 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Iris 349 Build/MocorDroid2.3.5) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; iris402+ Build/iris402+) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; IRIS402 Build/LAVAIRIS402) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; iris405 Build/LAVAIRIS405) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; IRIS_501 Build/LAVAIRIS501) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; iris402e Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; iris503e Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'UCWEB/2.0 (Linux; U; Opera Mini/7.1.32052/30.3697; en-US; IRIS402) U2/1.0.0 UCBrowser/9.1.1.420 Mobile' => array('isMobile' => true, 'isTablet' => false), + 'UCWEB/2.0 (MIDP-2.0; U; Adr 4.2.2; en-US; IRIS402) U2/1.0.0 UCBrowser/9.1.1.420 U2/1.0.0 Mobile' => array('isMobile' => true, 'isTablet' => false), + 'UCWEB/2.0 (Linux; U; Opera Mini/7.1.32052/30.3697; en-US; IRIS355) U2/1.0.0 UCBrowser/9.1.1.420 Mobile' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; iris356 Build/irisIRIS356) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.5.0.360 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'UCWEB/2.0 (Linux; U; Opera Mini/7.1.32052/30.3697; en-US; iris356) U2/1.0.0 UCBrowser/9.0.2.389 Mobile' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; iris500 Build/iris500) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; iris700 Build/iris700) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; QPAD E704 Build/JDQ39) AppleWebKit/537.36 (KHTML like Gecko) Chrome/36.0.1985.131 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.2; xx-xx; IvoryS Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-US; E-TAB IVORY Build/E702) AppleWebKit/534.31 (KHTML, like Gecko) UCBrowser/9.3.0.321 U3/0.8.0 Mobile Safari/534.31' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 2.3.4; tr-tr; E-TAB Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true) + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Leader.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Leader.php new file mode 100644 index 00000000000..fbdf4b5cdc1 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Leader.php @@ -0,0 +1,6 @@ + array('isMobile' => true, 'isTablet' => true) + ) +); \ No newline at end of file diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lenovo.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lenovo.php new file mode 100644 index 00000000000..d4f6e6fd53e --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lenovo.php @@ -0,0 +1,46 @@ + array( + + 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-es; IdeaTab_A1107 Build/MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.0.3; IdeaTab A2107A-H Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-au; ThinkPad Tablet Build/ThinkPadTablet_A400_03) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'UCWEB/2.0 (Linux; U; Opera Mini/7.1.32052/30.3697; en-US; IdeaTabA1000-G) U2/1.0.0 UCBrowser/9.2.0.419 Mobile' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.1.2; IdeaTabA1000-F Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.1; Lenovo A3000-H Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.117 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.2; IdeaTab A3000-F Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.360' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1; zh-cn; Lenovo-A3000-H/S100) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.1 Mobile Safari/534.300' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; es-us; IdeaTab A3000-F Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.0.3; IdeaTab A2107A-H Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; IdeaTab A2107A-H Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; es-es; IdeaTabA2109A Build/JRO03R) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; nl-nl; IdeaTabA2109A Build/JRO03R) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-es; IdeaTab_A1107 Build/MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.300' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.2; IdeaTab S6000-H Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; IdeaTab S6000-F Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.2; Lenovo B8000-F Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.2.2;it-it; Lenovo B8000-F/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; it-it; Lenovo B6000-F/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.2; Lenovo B6000-F Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.2; IdeaPadA10 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; Android 4.1.2; Ideapad K1 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 2.3.7; de-de; IdeaPad A1 Build/GRK393; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; Android 4.3; Lenovo B8080-H Build/JLS36C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; hu-hu; Lenovo A3500-FL Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; Lenovo A7600-F Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; Android 4.4.2; Lenovo A5500-F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Lenovo A390 Linux/3.0.13 Android/4.4.2 Release/04.03.2013 Browser/AppleWebKit534.30 Profile/MIDP-2.0 Configuration/CLDC-1.1 Mobile Safari/534.30 Android 4.0.1;' => array('isMobile' => true, 'isTablet' => false), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Mi.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Mi.php new file mode 100644 index 00000000000..4cd332fcdd2 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Mi.php @@ -0,0 +1,22 @@ + array( + 'Mozilla/5.0 (Linux; U; Android 4.2; xx-xx; HM NOTE 1W Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 MobilSafari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.1; zh-cn; MI-ONE Plus Build/ITL41D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.1; zh-cn; MI-ONE Plus Build/ITL41D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; MI 2SC Build/JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; MI 2S Build/JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; zh-tw; MI 1S Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.8; zh-cn; xiaomi2 Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/4.4 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; es-es; MI 2A Build/miui.es JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.1; zh-cn; MI 3 Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; MI 1S Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; MI 3W Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; HM 1SC Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; HM 1SW Build/JLS36C) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36 XiaoMi/MiuiBrowser/2.0.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; HM NOTE 1W Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36 XiaoMi/MiuiBrowser/2.0.1' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; MI-ONE C1 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.4.4; en-us; MI 4W Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36 XiaoMi/MiuiBrowser/2.0.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4; MI PAD Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Microsoft.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Microsoft.php new file mode 100644 index 00000000000..e46edc0904b --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Microsoft.php @@ -0,0 +1,30 @@ + array( + // Surface tablet + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch; .NET4.0E; .NET4.0C; Tablet PC 2.0)' => array('isMobile' => true, 'isTablet' => true, 'version' => array('IE' => '10.0', 'Windows NT' => '6.2', 'Trident' => '6.0') ), + // Ambiguos. + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)' => array('isMobile' => true, 'isTablet' => false), + // Ambiguos. + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)' => array('isMobile' => true, 'isTablet' => false), + // http://www.whatismybrowser.com/developers/unknown-user-agent-fragments + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch; ARMBJS)' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; Touch; MASMJS)' => array('isMobile' => false, 'isTablet' => false), + + // Thanks to Jonathan Donzallaz! + // Firefox (nightly) in metro mode on Dell XPS 12 + 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:25.0) Gecko/20130626 Firefox/25.0' => array('isMobile' => false, 'isTablet' => false), + // Firefox in desktop mode on Dell XPS 12 + 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0' => array('isMobile' => false, 'isTablet' => false), + // IE10 in metro mode on Dell XPS 12 + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; MDDCJS)' => array('isMobile' => false, 'isTablet' => false), + // IE10 in desktop mode on Dell XPS 12 + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; MDDCJS)' => array('isMobile' => false, 'isTablet' => false), + // Opera on Dell XPS 12 + 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130' => array('isMobile' => false, 'isTablet' => false), + // Chrome on Dell XPS 12 + 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), + // Google search app from Windows Store + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; Touch; MDDCJS; WebView/1.0)' => array('isMobile' => false, 'isTablet' => false), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Motorola.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Motorola.php new file mode 100644 index 00000000000..d322660d1f3 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Motorola.php @@ -0,0 +1,52 @@ + array( + 'MOT-W510/08.11.05R MIB/BER2.2 Profile/MIDP-2.0 Configuration/CLDC-1.1 EGE/1.0 UP.Link/6.3.0.0.0' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.2.2; zh-cn; ME722 Build/MLS2GC_2.6.0) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; DROIDX Build/4.5.1_57_DX8-51) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; MB855 Build/4.5.1A-1_SUN-254_13) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.5; es-us; MB526 Build/4.5.2-51_DFL-50) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-ca; MB860 Build/4.5.2A-51_OLL-17.8) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; MOT-XT535 Build/V1.540) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.7; ko-kr; A853 Build/SHOLS_U2_05.26.3; CyanogenMod-7.1.2) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 3.1; en-us; Xoom Build/HMJ25) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; DROID RAZR 4G Build/6.7.2-180_DHD-16_M4-31) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; Xoom Build/IMM76L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; pt-br; XT687 Build/V2.27D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.0.4', 'Webkit' => '534.30', 'Safari' => '4.0'), 'model' => 'XT687' ), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-es; MOT-XT910 Build/6.7.2-180_SPU-19-TA-11.6) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; XT910 Build/9.8.2O-124_SPUL-17) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; XT915 Build/2_32A_2031) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; XT919 Build/2_290_2017) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.64 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; XT925 Build/9.8.2Q-50-XT925_VQLM-20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; XT907 Build/9.8.1Q-66) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; XT901 Build/9.8.2Q-50_SLS-13) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; DROID BIONIC Build/9.8.2O-72_VZW-22) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + + 'Mozilla/5.0 (Linux; Android 4.4.2; XT1022 Build/KXC20.82-14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.4.4; en-in; XT1022 Build/KXC21.5-40) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.16'=> array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; XT1025 Build/KXC20.82-13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; XT1052 Build/KLA20.16-2.16.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; XT1052 Build/13.9.0Q2.X_83) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; XT1053 Build/13.9.0Q2.X_61) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; XT1053 Build/13.9.0Q2.X_55) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; XT1056 Build/13.9.0Q2.X-116-MX-17-6-2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.64 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; XT1031 Build/KXB20.9-1.10-1.18-1.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.4; XT1032 Build/KXB21.14-L1.40) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.4.2; de-de; XT1032 Build/KLB20.9-1.10-1.24-1.1) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.16' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; XT1034 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; XT1034 Build/14.10.0Q3.X-84-16) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; XT1035 Build/14.10.0Q3.X-23) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.3; XT1039 Build/KXB21.14-L1.31) AppleWebKit/537.36 (KHTML like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; XT919 Build/2_290_2002) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; XT919 Build/2_290_2004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; XT920 Build/2_290_2014) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; XT920 Build/2_310_2014) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.4; XT905 Build/7.7.1Q_GCIRD-16) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; XT908 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; XT897 Build/7.7.1Q-6_SPR-ASANTI_LE-18) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 5.0.2; XT1032 Build/LXB22.46-28.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 5.1.1; Moto E Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.4; XT1021 Build/KTU84Q) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Nokia.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Nokia.php new file mode 100644 index 00000000000..99cf9d9bb62 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Nokia.php @@ -0,0 +1,84 @@ + array( + 'Nokia200/2.0 (12.04) Profile/MIDP-2.1 Configuration/CLDC-1.1 UCWEB/2.0 (Java; U; MIDP-2.0; en-US; nokia200) U2/1.0.0 UCBrowser/8.9.0.251 U2/1.0.0 Mobile UNTRUSTED/1.0' => array('isMobile' => true, 'isTablet' => false), + 'Nokia6303iclassic/5.0 (06.61) Profile/MIDP-2.1 Configuration/CLDC-1.1 Mozilla/5.0 AppleWebKit/420+ (KHTML, like Gecko) Safari/420+' => array('isMobile' => true, 'isTablet' => false), + 'nokian73-1/UC Browser7.8.0.95/69/400 UNTRUSTED/1.0' => array('isMobile' => true, 'isTablet' => false), + 'Nokia2760/2.0 (06.82) Profile/MIDP-2.1 Configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), + 'Nokia3650/1.0 SymbianOS/6.1 Series60/1.2 Profile/MIDP-1.0 Configuration/CLDC-1.0' => array('isMobile' => true, 'isTablet' => false), + 'NokiaN70-1/5.0737.3.0.1 Series60/2.8 Profile/MIDP-2.0 Configuration/CLDC-1.1/UC Browser7.8.0.95/27/352' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (S60V3; U; ru; NokiaN73) AppleWebKit/530.13 (KHTML, like Gecko) UCBrowser/8.6.0.199/28/444/UCWEB Mobile' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (S60V3; U; ru; NokiaC5-00.2)/UC Browser8.5.0.183/28/444/UCWEB Mobile' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (S60V3; U; ru; NokiaC5-00.2) AppleWebKit/530.13 (KHTML, like Gecko) UCBrowser/8.7.0.218/28/352/UCWEB Mobile' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Series40; NokiaC3-00/08.63; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/2.2.0.0.33' => array('isMobile' => true, 'isTablet' => false), + 'Opera/9.80 (Series 60; Opera Mini/7.0.31380/28.2725; U; es) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Opera Mini' => '7.0.31380', 'Presto' => '2.8.119')), + 'Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaC7-00/025.007; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.37 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaX7-00/022.014; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.37 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Symbian/3; Series60/5.3 NokiaE6-00/111.140.0058; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/535.1 (KHTML, like Gecko) NokiaBrowser/8.3.1.4 Mobile Safari/535.1 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Symbian/3; Series60/5.3 NokiaC6-01/111.040.1511; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/535.1 (KHTML, like Gecko) NokiaBrowser/8.3.1.4 Mobile Safari/535.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Symbian/3; Series60/5.3 NokiaC6-01; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.4.2.6 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Symbian/3; Series60/5.3 Nokia700/111.030.0609; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.4.2.6 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Symbian/3; Series60/5.3 Nokia700/111.020.0308; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.4.1.14 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Symbian/3; Series60/5.3 NokiaN8-00/111.040.1511; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/535.1 (KHTML, like Gecko) NokiaBrowser/8.3.1.4 Mobile Safari/535.1 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Symbian/3; Series60/5.3 Nokia701/111.030.0609; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.4.2.6 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 Nokia6120c/3.83; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 Nokia6120ci/7.02; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 Nokia6120c/7.10; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE66-1/510.21.009; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE71-1/110.07.127; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaN95-3/20.2.011 Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE51-1/200.34.36; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE63-1/500.21.009; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaN82/10.0.046; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE52-1/052.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.2' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE52-1/@version@; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.26 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaC5-00/031.022; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.3.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaC5-00.2/081.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.32 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.3; U; Series60/3.2 NokiaN79-1/32.001; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.3; U; Series60/3.2 Nokia6220c-1/06.101; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaC5-00.2/071.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.26 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE72-1/081.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.32 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaC5-00/061.005; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.2 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaX6-00/40.0.002; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.33 Mobile Safari/533.4 3gpp-gb' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 Nokia5800d-1/60.0.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.33 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaC5-03/12.0.023; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.9 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 Nokia5228/40.1.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.7.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 Nokia5230/51.0.002; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.33 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 Nokia5530c-2/32.0.007; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.9 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/21.0.045; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.4' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-4/30.0.004; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.28 3gpp-gba' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Symbian' => '9.4', 'Webkit' => '533.4', 'NokiaBrowser' => '7.3.1.28'), 'model' => 'NokiaN97-4' ), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 7 Mozart T8698)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; 710)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 800)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 800C)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 800C; Orange)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 900)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; HD7 T9292)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; LG E-900)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 610)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 710)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 710; Orange)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 710; T-Mobile)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 710; Vodafone)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800) UP.Link/5.1.2.6' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800; Orange)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800; SFR)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800; T-Mobile)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800; vodafone)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; Lumia 800c)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 900)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; Lumia 920)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)' => array('isMobile' => true, 'isTablet' => false, 'version' => array('IE' => '10.0', 'Windows Phone OS' => '8.0', 'Trident' => '6.0'), 'model' => 'Lumia 920' ), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; lumia800)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Nokia 610)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Nokia 710)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Nokia 800)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Nokia 800C)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Nokia 900)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; Nokia)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; SGH-i917)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; TITAN X310e)' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Windows Phone OS' => '7.5', 'Trident' => '5.0'), 'model' => 'TITAN X310e' ), + 'Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 520) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537' => array('isMobile' => true, 'isTablet' => false), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Onda.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Onda.php new file mode 100644 index 00000000000..3887f5d8018 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Onda.php @@ -0,0 +1,12 @@ + array( + 'Mozilla/5.0 (Linux; Android 4.2.2; V975i Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.108 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Android; Tablet; rv:37.0) Gecko/37.0 Firefox/37.0' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; V975m Core4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.3; fr-fr; V975m Core4 Build/JSS15J) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Safari/537.16' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.3; V975m Core4 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; V812 Core4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + ) + +); \ No newline at end of file diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Others.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Others.php new file mode 100644 index 00000000000..56d64079ca2 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Others.php @@ -0,0 +1,531 @@ + array( + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; E1C Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; id-id; T3C Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Ainol' => array( + + 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Ainol Novo8 Advanced Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.1.1; Novo10 Hero Build/20121115) AppleWebKit/535.19 (KHTML like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; es-es; novo9-Spark Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + + ), + 'AllFine' => array( + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; FINE7 GENIUS Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Amoi' => array( + 'Amoi 8512/R18.0 NF-Browser/3.3' => array('isMobile' => true, 'isTablet' => false, 'model' => '8512'), + ), + + 'Arnova' => array( + 'Mozilla/5.0 (Linux; U; Android 4.0.3; fr-fr; AN9G2I Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'AudioSonic' => array( + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-au; T-17B Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + + 'Blaupunkt' => array( + 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; Endeavour 800NG Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + ), + + 'Broncho' => array( + + 'Mozilla/5.0 (Linux; U; Android 2.2; es-es; Broncho N701 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + + ), + + // @ref: http://www.bqreaders.com/gb/tablets-prices-sale.html + 'bq' => array( + 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-es; bq Livingstone 2 Build/1.1.7 20121018-10:33) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-es; bq Edison Build/1.1.10-1015 20121230-18:00) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.0.3; Maxwell Lite Build/v1.0.0.ICS.maxwell.20120920) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; zh-tw; bq Maxwell Plus Build/1.0.0 20120913-10:39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; Aquaris E10 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Captiva' => array( + 'Opera/9.80 (X11; Linux zvav; U; de) Presto/2.8.119 Version/11.10 Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; CAPTIVA PAD 10.1 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + ), + + 'Casio' => array( + 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; C771 Build/C771M120) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + ), + + 'ChangJia' => array( + + 'Mozilla/5.0 (Linux; U; Android 4.0.4; pt-br; TPC97113 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; TPC7102 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true) + + ), + + + 'Celkon' => array( + 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; Celkon CT 910+ Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-in; CT-1 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'CELKON.C64/R2AE SEMC-Browser/4.0.3 Profile/MIDP-2.0 Configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Celkon A125 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-US; Celkon*A86 Build/Celkon_A86) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 UCBrowser/8.7.0.315 Mobile' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Celkon A.R 40 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + ), + + // @ref: http://www.cobyusa.com/?p=pcat&pcat_id=3001 + 'Coby' => array( + 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; MID7010 Build/FRF85B) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; MID7048 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; MID8042 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Concorde' => array( + 'Mozilla/5.0 (Linux; U; Android 4.1.1; hu-hu; ConCorde Tab T10 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; hu-hu; ConCorde tab PLAY Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Cresta' => array( + 'Mozilla/5.0 (Linux; U; Android 4.0.4; nl-nl; CRESTA.CTP888 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Cube' => array( + 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; CUBE U9GT 2 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Danew' => array( + + 'Mozilla/5.0 (Linux; U; Android 4.0.3; es-es; Dslide 700 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array( 'Android' => '4.0.3', 'Build' => 'IML74K', 'Webkit' => '534.30', 'Safari' => '4.0' ), 'model' => 'Dslide 700' ) + + ), + + 'DanyTech' => array( + 'Mozilla/5.0 (Linux; Android 4.2.2; Genius Tab Q4 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + ), + + + + 'Digma' => array( + 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; iDx10 3G Build/ICS.b02ref.20120331) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'DPS' => array( + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; DPS Dream 9 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'ECS' => array( + 'Mozilla/5.0 (Linux; U; Android 4.0.4; it-it; TM105A Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'IMM76D', 'Webkit' => '534.30')) + ), + + 'Eboda' => array( + 'Mozilla/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Supreme Dual Core X190 Build/JRO03C) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Webkit' => '534.30', 'Safari' => '4.0')), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Essential A160 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.0.3; E-Boda Supreme X80 Dual Core Build/ICS.g12refM806A1YBD.20120925) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; ro-ro; E-boda essential smile Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Supreme X80 Dual Core Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Supreme XL200IPS Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Evolio' => array( + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Evolio X7 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; ro-ro; ARIA_Mini_wifi Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Fly' => array( + 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; Fly IQ440; Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; FLY IQ256 Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + ), + + 'Fujitsu' => array( + + 'Mozilla/5.0 (Linux; U; Android 4.0.3; ja-jp; F-10D Build/V21R48A) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'V21R48A', 'Webkit' => '534.30', 'Safari' => '4.0') ), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; M532 Build/IML74K) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'IML74K', 'Webkit' => '534.30', 'Safari' => '4.0') ), + + ), + + 'FX2' => array( + + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; FX2 PAD7 RK Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + + ), + + // @ref: http://www.galapad.net/product.html + 'Galapad' => array( + + 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-tw; G1 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Webkit' => '534.30', 'Safari' => '4.0', 'Build' => 'JRO03C') ), + + ), + + 'GoClever' => array( + 'Mozilla/5.0 (Linux; U; Android 4.0.3; el-gr; GOCLEVER TAB A103 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 2.3.4; zh-tw; A7GOCLEVER Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.0.4; GOCLEVER TAB A104 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; cs-cz; GOCLEVER TAB A93.2 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; sk-sk; GOCLEVER TAB A971 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; lv-lv; GOCLEVER TAB A972BK Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; fr-fr; GOCLEVER TAB A104.2 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; pt-pt; GOCLEVER TAB T76 Build/MID) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'GU' => array( + + 'Mozilla/5.0 (Linux; U; Android 4.0.4; vi-vn; TX-A1301 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'IMM76D', 'Webkit' => '534.30', 'Safari' => '4.0')), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; da-dk; Q702 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'IML74K', 'Webkit' => '534.30', 'Safari' => '4.0')), + + ), + + 'HCL' => array( + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; U1 Build/HCL ME Tablet U1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; U1 Build/HCL ME Tablet U1) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.1.2; Connect-3G-2.0 Build/HCL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 2.3.3; pt-br; X1 Build/HCL ME Tablet X1) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + ), + + + + 'Hudl' => array( + 'Mozilla/5.0 (Linux; Android 4.2.2; Hudl HT7S3 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + ), + + + 'Iconbit' => array( + 'Mozilla/5.0 (Linux; Android 4.1.1; NT-3702M Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36 OPR/16.0.1212.65583' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; NetTAB SPACE II Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'iJoy' => array('Mozilla/5.0 (Linux; U; Android 4.1.1; fr-fr; Tablet Planet II-v3 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true)), + + 'Intenso' => array( + 'Mozilla/5.0 (Linux; U; Android 4.1.1.;de-de; INM8002KP Build/JR003H) AppleWebKit/534.30 (KHTML, like Gecko)Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, 'version' => array( + 'Android' => '4.1.1.', 'Webkit' => '534.30', 'Safari' => '4.0' + ), + ), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; TAB1004 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + ), + + 'INQ' => array( + 'INQ1/R3.9.12 NF-Browser/3.5' => array('isMobile' => true, 'isTablet' => false, 'model' => 'INQ1'), + ), + + // @todo: Test this + 'Intex' => array( + 'Mozilla/5.0 (Linux; U; Android 2.3; en-US; Cloud_X2 Build/MocorDroid4.0.1) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 UCBrowser/9.2.0.419 Mobile' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Cloud Y2 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-in; Cloud X5 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + ), + + 'IRU' => array( + + 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; M702pro Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + + ), + + 'JXD' => array('Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; F3000 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true) + ), + + 'Karbonn' => array( + 'Mozilla/5.0 (Linux; Android 4.1.1; ST10 Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Kobo' => array( + 'Mozilla/5.0 (Linux; U; Android 2.0; en-us;) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 (Kobo Touch)' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '2.0', 'Webkit' => '533.1', 'Safari' => '4.0') ), + ), + + 'Megafon' => array( + 'Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ru; MegaFon V9 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.1.1; MT7A Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31' => array('isMobile' => true, 'isTablet' => true), + ), + + 'MediaTek' => array( + 'Mozilla/5.0 (Linux; U; Android 4.1.1; fr-fr; MT8377 Build/JRO03C) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30/4.05d.1002.m7' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Micromax' => array( + + 'Mozilla/5.0 (Linux; Android 4.1.1; Micromax A110 Build/JRO03C) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03C', 'Webkit' => '537.22', 'Chrome' => '25.0.1364.169') ), + 'Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; Micromax P250(Funbook) Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Webkit' => '534.30', 'Android' => '4.0', 'Build' => 'IMM76D', 'Safari' => '4.0') ), + + ), + + 'Modecom' => array( + 'Mozilla/5.0 (Linux; U; Android 4.2.2; pl-pl; FreeTAB 1014 IPS X4+ Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'MSI' => array( + 'Mozilla/5.0 (Linux; U; Android 2.3.5; el-gr; MSI Enjoy 10 Plus Build/1.2) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + ), + + // @ref: https://www.nabitablet.com/ + 'Nabi' => array( + 'Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; NABI-A Build/MASTER) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + ), + + 'NEC' => array( + // @ref: http://www.n-keitai.com/n-08d/?from=mediasnet + // @ref: http://devlog.dcm-gate.com/2012/03/medias-tab-n-06duseragnet.html + // @ref: http://keitaiall.jp/N-08D.html aka MEDIAS TAB + 'Mozilla/5.0 (Linux; U; Android 4.0.4; ja-jp; N-08D Build/A5001911) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android AAA; BBB; N-06D Build/CCC) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + + ), + + 'Nexo' => array( + 'Mozilla/5.0 (Linux; U; Android 4.1.1; pl-pl; NEXO 3G Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 ACHEETAHI/2100050074' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Nibiru' => array( + 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-tw; Nibiru H1 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), + ), + + 'Nook' => array( + + 'Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; NOOK BNRV200 Build/ERD79 1.4.3) Apple WebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '2.2.1', 'Webkit' => '533.1', 'Safari' => '4.0') ), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; NOOK BNTV400 Build/ICS) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'ICS', 'Webkit' => '534.30', 'Safari' => '4.0') ), + 'Mozilla/5.0 (Linux; Android 4.0.4; BNTV600 Build/IMM76L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36 Hughes-PFB/CID5391275.AID1376709964' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'IMM76L', 'Webkit' => '537.36', 'Chrome' => '28.0.1500.94') ), + + ), + + 'Oneplus' => array( + 'Mozilla/5.0 (Linux; Android 4.3; A0001 Build/JLS36C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; xx-xx; A0001 Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + ), + + 'Odys' => array( + 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; LOOX Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; LOOX Plus Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.X; de-de; XENO10 Build/ODYS XENO 10) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 2.2.2; de-de; ODYS Space Build/I700T_P7_T04_TSCL_FT_R_0_03_1010_110623) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; ODYS-EVO Build/ODYS-EVO) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true + ), + 'Mozilla/5.0 (Linux; U; Android 4.1.X; de-de; Xelio 10 Pro Build/ODYS_Xelio) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true + ), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; NEO_QUAD10 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true + ), + 'Mozilla/5.0 (Linux; U; Android 4.1.X; de-de; Xelio10Pro Build/ODYS_Xelio) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 2.3.1; en-us; ODYS-Xpress Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; de-de; XELIO7PHONETAB Build/IMM76I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; XELIO10EXTREME Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; de-de; XELIO Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 Mobile UCBrowser/3.2.1.441' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; XELIOPT2 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; nl-nl; ODYS-NOON Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'OverMax' => array( + 'OV-SteelCore(B) Mozilla/5.0 (iPad; CPU OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; pl-pl; OV-SteelCore Build/ICS.g08refem611.20121010) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'YONESTablet' => array( + 'Mozilla/5.0 (Linux; U; Android 4.0.4; pl-pl; BC1077 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + // @todo: Research http://www.pantech.com/ + 'Pantech' => array( + 'PANTECH-C790/JAUS08312009 Browser/Obigo/Q05A Profile/MIDP-2.0 Configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.2.1; ko-kr; SKY IM-A600S Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; ADR8995 4G Build/GRI40) AppleWebKit/533.1 (KHTML like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 3.2.1; en-us; PantechP4100 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array( + 'isMobile' => true, 'isTablet' => true), + ), + + 'Philips' => array( + 'Mozilla/5.0 (Linux; Android 4.0.4; Philips W336 Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.45 Mobile Safari/537.36 OPR/15.0.1162.59192' => array('isMobile' => true, 'isTablet' => false), + 'Philips_T3500/V1 Linux/3.4.5 Android/4.2.2 Release/03.26.2013 Browser/AppleWebKit534.30 Mobile Safari/534.30 MBBMS/2.2 System/Android 4.2.2;' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; Philips W3568 Build/Philips_W3568) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; Philips W832 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux;U;Android 4.2.2;es-us;Philips S388 Build/JDQ39) AppleWebkit/534.30 (HTML,like Gecko) Version/4.0 Mobile Safari/534.30;' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.4; Philips W536 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux;U;Android 4.2.2;es-us;Philips S308 Build/JDQ39) AppleWebkit/534.30 (HTML,like Gecko) Version/4.0 Mobile Safari/534.30;' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; ru-ru; Philips-W8500 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; ru; Philips W8510 Build/JDQ39) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.8.9.457 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; ru-RU; Philips W3568 Build/Philips W3568) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.1 Mobile Safari/534.30;' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; Philips S388 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.1; Build/PI3100.00.00.24) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; W732 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.1; PI7100_93 Build/PI7100.C.00.00.11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + ), + + 'PocketBook' => array( + 'Mozilla/5.0 (Linux; U; Android 2.3.7; en-ru; PocketBook A10 3G Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + ), + + 'PointOfView' => array( + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; POV_TAB-PROTAB30-IPS10 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Praktica' => array( + 'Mozilla/5.0 (Linux; Android 4.0.4; TP750 3GGSM Build/IMM76I) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Safari/537.36' => array('isMobile' => true, 'isTablet' => true) + ), + + 'PROSCAN' => array( + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; PLT8088 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03H', 'Webkit' => '534.30', 'Safari' => '4.0') ), + ), + + 'PyleAudio' => array( + 'Mozilla/5.0 (Linux; Android 4.0.4; PTBL92BC Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'IMM76D', 'Webkit' => '537.36', 'Chrome' => '31.0.1650.59')), + + ), + + 'RockChip' => array( + 'Mozilla/5.0 (Linux; U; Android 2.2.1; hu-hu; RK2818, Build/MASTER) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android Android 2.1-RK2818-1.0.0; zh-cn; MD701 Build/ECLAIR) AppleWebKit/530.17 (KHTML like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => true), + ), + + 'RossMoor' => array( + 'Mozilla/5.0 (Linux; U; Android 4.2.1; ru-ru; RM-790 Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true) + + ), + + // @ref: http://www.qmobile.com.pk/complete_range.php# + 'QMobile' => array( + 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; A2 Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + ), + + 'simvalley' => array( + 'Mozilla/5.0 (Linux; U; Android 2.3.4; de-de; SP-80 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + ), + + 'Skk' => array('Mozilla/5.0 (Linux; U; Android 4.1; en-us; CYCLOPS Build/F10) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true)), + + 'Storex' => array( + 'Mozilla/5.0 (Linux; Android 4.1.1; eZee_Tab903 Build/JRO03H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03H', 'Webkit' => '537.36')), + "Mozilla/5.0 (Linux; Android 4.1.1; eZee'Tab785 Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Safari/537.36" => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03C', 'Webkit' => '537.36')), + "Mozilla/5.0 (Linux; Android 4.0.3; eZee'Tab971 Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19" => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'IML74K', 'Webkit' => '535.19')), + ), + + 'Teclast' => array( + 'Mozilla/5.0 (Linux; Android 4.4.2; P98 3G\xE5\x85\xAB\xE6\xA0\xB8(A3HY) Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'QQ\xe9\x9f\xb3\xe4\xb9\x90HD 4.0.1 (iPad; iPhone OS 8.0; zh_CN)' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; A15(E6C2) Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 2.3; xx-xx; A10 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; Teclast A10T Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; zh-cn; Teclast P85(A9D3) Build/IMM76D) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; A70H Build/JDQ39) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.8.0.435 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Tecno' => array( + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; TECNO P9 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true) + ), + + 'Telstra' => array( + 'Mozilla/5.0 (Linux; U; Android 2.3.7; en-au; T-Hub2 Build/TVA301TELBG3) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + ), + + // @info: http://www.texet.ru/tablet/ + 'texet' => array( + 'Mozilla/5.0 (Linux; U; Android 2.3.4; ru-ru; TM-7021 Build/GB.m1ref.20120116) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '2.3.4', 'Webkit' => '533.1', 'Safari' => '4.0'), 'model' => 'TM-7021' ), + ), + + 'Tolino' => array( + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 7 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39', 'Webkit' => '534.30', 'Safari' => '4.0')), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 8.9 Build/JDQ39) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39', 'Webkit' => '534.30', 'Safari' => '4.0')), + 'Mozilla/5.0 (Linux; Android 4.2.2; tolino tab 7 Build/JDQ39) AppleWebkit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36 OPR/18.0.1290.67495' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 7 Build/JDQ39) AppleWebkit/537.36 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Toshiba' => array( + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; TOSHIBA; TSUNAGI)' => array('isMobile' => true, 'isTablet' => false), + // @ref: http://www.toshiba.co.uk/discontinued-products/folio-100/ + 'Mozilla/5.0 (Linux; U; Android 2.2; it-it; TOSHIBA_FOLIO_AND_A Build/TOSHIBA_FOLIO_AND_A) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '2.2', 'Webkit' => '533.1', 'Safari' => '4.0') ), + ), + + 'Trekstor' => array( + 'Mozilla/5.0 (Linux; Android 4.2.2; ST70408-1 Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39', 'Webkit' => '537.31', 'Chrome' => '26.0.1410.58')), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; engb; Build/IMM76D) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3 SurfTab_7.0' => array( + 'isMobile' => true, 'isTablet' => true, + ), + 'Mozilla/5.0 (Linux; Android 4.2.2; VT10416-2 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( + 'isMobile' => true, 'isTablet' => true + ), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ST10216-2A Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30;SurfTab_10.1' => array( + 'isMobile' => true, 'isTablet' => true + ), + ), + + 'Ubislate' => array( + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; UBISLATE7C+ Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true) + ), + + 'Visture' => array( + + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; V97 HD Build/LR-97JC) Apple WebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; Visture V4 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; Visture V4 HD Build/Visture V4 HD) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; es-es; Visture V5 HD Build/Visture V5 HD) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; Visture V10 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Versus' => array( + 'Mozilla/5.0 (Linux; Android 4.0.4; VS-TOUCHPAD 9 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; Versus Touchpad 9.7 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-gb; CnM-TOUCHPAD7 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 BMID/E67A45B1AB' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; CnM TouchPad 7DC Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 TwonkyBeamBrowser/3.3.5-95 (Android 4.1.1; rockchip CnM TouchPad 7DC Build/meizhi_V2.80.wifi8723.20121225.b11c800)' => array('isMobile' => true, 'isTablet' => true), + 'OneBrowser/3.5/Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; TOUCHPAD 7 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; TOUCHTAB Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03H', 'Webkit' => '534.30', 'Safari' => '4.0') ), + ), + + 'Viewsonic' => array( + 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; ViewPad 10e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 2.2; it-it; ViewPad7 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' =>array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 2.2.1; en-ca; ViewSonic VB733 Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 3.2; en-gb; ViewPad7X Build/HTJ85B) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 2.2; pt-br; ViewPad 10S Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; VB100a Pro Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Vonino' => array( + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Sirius_Evo_QS Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Q8 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + + ), + + 'Wolder' => array( + 'Mozilla/5.0 (Linux; Android 4.4; miTab LIVE Build/KVT49L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; pt-pt; miTab FUNK Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), + + 'Wolfgang' => array( + 'Mozilla/5.0 (Linux; U; Android 4.2.1; nl-nl; AT-AS45q2 Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false) + ), + + 'Xoro' => array( + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; PAD 9720QR Build/PAD 9719QR) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.2; PAD720 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => true) + ), + + 'ZTE' => array( + 'Mozilla/5.0 (Linux; U; Android 4.2.1;zh-cn; ZTE V987 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30;' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.5; pt-pt; Blade Build/tejosunhsine) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; ZTE; N880e_Dawoer_Fulllock; China Telecom)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; ZTE; V965W)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; ZTE; Windows Phone - Internet 7; SFR)' => array('isMobile' => true, 'isTablet' => false), + ), + + 'Zync' => array( + 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us ; Z909 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1/UCBrowser/8.4.1.204/145/444' => array('isMobile' => true, 'isTablet' => true) + ) + +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Prestigio.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Prestigio.php new file mode 100644 index 00000000000..c86e3b192eb --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Prestigio.php @@ -0,0 +1,12 @@ + array( + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; PMP5297C_QUAD Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; sk-sk; PMP7100D3G Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'IMM76D', 'Webkit' => '534.30', 'Safari' => '4.0'), 'model' => 'PMP7100D3G' ), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; sk-sk; PMP7280C3G Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 MobilSafari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; PMT3017_WI Build/KVT49L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; PMT3037_3G Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; PMT5002_Wi Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; el-gr; PMT5887_3G Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + ), +); \ No newline at end of file diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Samsung.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Samsung.php new file mode 100644 index 00000000000..e7099c5efc2 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Samsung.php @@ -0,0 +1,131 @@ + array( + 'MQQBrowser/4.0/Mozilla/5.0 (Linux; U; Android 3.2; zh-cn; GT-P6800 Build/HTJ85B) AppleWebKit/533.1 (KHTML, like Gecko) Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true, 'version' => array('MQQBrowser' => '4.0')), + 'SAMSUNG-SGH-P250-ORANGE/P250BVHH8 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0' => array('isMobile' => true, 'isTablet' => false), + 'SAMSUNG-GT-B2710/B271MCXKF1 SHP/VPP/R5 Dolfin/2.0 QTV/5.3 SMM-MMS/1.2.0 profile/MIDP-2.1 configuration/CLDC-1.1 OPN-B' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Dolfin' => '2.0') ), + 'SAMSUNG-SGH-D900i/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0' => array('isMobile' => true, 'isTablet' => false), + 'SAMSUNG-GT-S5233T/S5233TXEJE3 SHP/VPP/R5 Jasmine/0.8 Qtv5.3 SMM-MMS/1.2.0 profile/MIDP-2.1 configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S5380D/S5380FXXKL3; U; Bada/2.0; ru-ru) AppleWebKit/534.20 (KHTML, like Gecko) Dolfin/3.0 Mobile HVGA SMM-MMS/1.2.0 OPN-B' => array('isMobile' => true, 'isTablet' => false), + 'SAMSUNG-GT-C3312/1.0 NetFront/4.2 Profile/MIDP-2.0 Configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 1.5; de-de; Galaxy Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => array('isMobile' => true, 'isTablet' => false), + 'SAMSUNG-GT-S3650/S3650XEII3 SHP/VPP/R5 Jasmine/1.0 Nextreaming SMM-MMS/1.2.0 profile/MIDP-2.1 configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), + 'JUC (Linux; U; 2.3.6; zh-cn; GT-S5360; 240*320) UCWEB7.9.0.94/140/352' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S5250/S5250XEKJ3; U; Bada/1.0; ru-ru) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.0 Mobile WQVGA SMM-MMS/1.2.0 NexPlayer/3.0 profile/MIDP-2.1 configuration/CLDC-1.1 OPN-B' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; SAMSUNG; SGH-i917)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S8530/S8530XXJKA; U; Bada/1.2; cs-cz) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.2 Mobile WVGA SMM-MMS/1.2.0 OPN-B' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 1.6; ru-ru; Galaxy Build/Donut) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.1-update1; ru-ru; GT-I5500 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; GALAXY_Tab Build/MASTER) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 2.2; ja-jp; SC-01C Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + // @about FROYO: http://gizmodo.com/5543853/what-is-froyo + 'Mozilla/5.0 (Linux; U; Android 2.2; fr-fr; GT-I9000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.2.1; zh-cn; SCH-i909 Build/FROYO) UC AppleWebKit/534.31 (KHTML, like Gecko) Mobile Safari/534.31' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.3; ja-jp; SC-01C Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-gb; GT-P1000 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 2.3.3; el-gr; GT-I9001 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-ca; SGH-I896 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.4; es-us; GT-S5660L Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.1.261' => array('isMobile' => true, 'isTablet' => false, 'version' => array('MicroMessenger' => '4.5.1.261')), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-S6102 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; pt-br; GT-S5367 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; fr-fr; GT-S5839i Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S7500 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S5830 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; es-us; GT-B5510L Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; pl-pl; GT-I9001-ORANGE/I9001BVKPC Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; GT-I8150 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; nl-nl; GT-I9070 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S5360 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; es-us; GT-S6102B Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; GT-S5830i Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-I8160 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-S6802 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.7; ru-ru; GT-S5830 Build/GRWK74; LeWa_ROM_Cooper_12.09.21) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-N7000 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; GT-P7100 Build/HRI83) AppleWebkit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 3.2; he-il; GT-P7300 Build/HTJ85B) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 3.2; en-gb; GT-P6200 Build/HTJ85B) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-gb; GT-I9100 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; GT-I9100G Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; nl-nl; GT-P5100 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android-4.0.3; en-us; Galaxy Nexus Build/IML74K) AppleWebKit/535.7 (KHTML, like Gecko) CrMo/16.0.912.75 Mobile Safari/535.7' => array( 'isMobile' => true, 'isTablet' => false, 'version' => array('Chrome' => '16.0.912.75') ), + 'Mozilla/5.0 (Linux; Android 4.0.3; SGH-T989 Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Chrome' => '18.0.1025.166') ), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P5100 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.0.4; GT-I9300 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.4; SPH-D710 Build/IMM76I) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; zh-cn; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300-ORANGE/I9300BVBLG2 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; th-th; GT-I9300T Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-I9100 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us ; GT-I9100 Build/IMM76D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1/UCBrowser/8.4.1.204/145/355' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-N7000 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; th-th; GT-P6800 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.0.4; SAMSUNG-SGH-I747 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; es-es; GT-P5110 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.0.4; GT-P5110 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; zh-cn; SAMSUNG-GT-S7568_TD/1.0 Android/4.0.4 Release/07.15.2012 Browser/AppleWebKit534.30 Build/IMM76D) ApplelWebkit/534.30 (KHTML,like Gecko) Version/4.0 Mobile Safari/534.30' => array( 'isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.0.4') ), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P3100 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; tr-tr; GT-P3105 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-ca; GT-N8010 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-S7562 Build/IMM76I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; GT-N7100 Build/JZO54K) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Mobile Safari/537.22 OPR/14.0.1025.52315' => array( 'isMobile' => true, 'isTablet' => false, 'version' => array( 'Build' => 'JZO54K', 'Webkit' => '537.22', 'Opera' => '14.0.1025.52315' ) ), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-hk; GT-N7105 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; GT-N8000 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.1.1; SGH-i747M Build/JRO03L) AppleWebKit/535.19(KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Galaxy Nexus - 4.1.1 - with Google Apps - API 16 - 720x1280 Build/JRO03S) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; GT-I8262 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; it-it; Galaxy Nexus Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; SGH-I777 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; GT-S7710 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; GT-I9082 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; SGH-T999L Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; GT-P5210 Build/JDQ39) AppleWebKit/537.36 (KHTML, Like Gecko) Chrome/27.0.1453.90 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.2; en-us; SAMSUNG GT-I9200 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Version/1.0 Chrome/18.0.1025.308 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.2.2; zh-cn; SCH-I959 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Version/1.0 Chrome/18.0.1025.308 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; nl-nl; SM-T310 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.3; en-us; SAMSUNG SM-P600 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; GT-N5100 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; en-us; SAMSUNG SM-T530NU Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; SM-T800 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; fr-fr; SAMSUNG SM-T800 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; SM-T700 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.517 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; CETUS)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; Focus I917 By TC)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; Focus i917)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; FOCUS S)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; GT-I8350)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; GT-i8700)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; GT-S7530)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; Hljchm\'s Wp)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; I917)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; OMNIA 7)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; OMNIA7 By MWP_HS)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; OMNIA7)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; OMNIA7; Orange)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i677)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i917)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i917.)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i917R)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i937)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SMG-917R)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG_blocked_blocked_blocked; OMNIA7; Orange)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG_blocked_blocked_blocked_blocked; OMNIA7; Orange)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SUMSUNG; OMNIA 7)' => array('isMobile' => true, 'isTablet' => false), + + 'Mozilla/5.0 (Windows NT 6.2; ARM; Trident/7.0; Touch; rv:11.0; WPDesktop; SAMSUNG; GT-I8750) like Gecko' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Windows NT 6.2; ARM; Trident/7.0; Touch; rv:11.0; WPDesktop; GT-I8750) like Gecko' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; en-gb; SAMSUNG GT-I9205 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Version/1.0 Chrome/18.0.1025.308 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; GT-P7510 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; SHV-E160K/VI10.1802 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + + 'Mozilla/5.0 (Linux; Android 5.0.2; SM-T805 Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.92 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.4; SM-T116NQ Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.92 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 5.0.2; SM-G9250 Build/LRX22G; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/35.0.0.48.273;]' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; SM-T705Y Build/KOT49H) AppleWebKit/537.36(KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; SM-T705 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.45 Safari/537.36' => array('isMobile' => true, 'isTablet' => true) + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Sony.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Sony.php new file mode 100644 index 00000000000..4155daf0496 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Sony.php @@ -0,0 +1,85 @@ + array( + 'SonyEricssonK800i/R1AA Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.1-update1; es-ar; SonyEricssonE15a Build/2.0.1.A.0.47) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.1-update1; pt-br; SonyEricssonU20a Build/2.1.1.A.0.6) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-au; SonyEricssonX10i Build/3.0.1.G.0.75) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.4; ru-ru; SonyEricssonST18i Build/4.0.2.A.0.62) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.4; hr-hr; SonyEricssonST15i Build/4.0.2.A.0.62) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.4; sk-sk; SonyEricssonLT15i Build/4.0.2.A.0.62) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.7; th-th; SonyEricssonST27i Build/6.0.B.3.184) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 2.3.7; de-de; SonyEricssonST25i Build/6.0.B.3.184) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; pt-br; Xperia Tablet S Build/TID0092) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'TID0092', 'Webkit' => '534.30', 'Safari' => '4.0') ), + 'Mozilla/5.0 (Linux; Android 4.0.3; LT18i Build/4.1.A.0.562) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.3; Sony Tablet S Build/TISU0R0110) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; es-es; Sony Tablet S Build/TISU0143) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; SonyEricssonLT18i Build/4.1.B.0.587) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; fr-ch; SonyEricssonSK17i Build/4.1.B.0.587) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; SonyEricssonLT26i Build/6.1.A.2.45) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.4; LT22i Build/6.1.B.0.544) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; vi-vn; SonyEricssonLT22i Build/6.1.B.0.544) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.4; ST23i Build/11.0.A.5.5) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.4; ST23i Build/11.0.A.2.10) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.0.4; LT28h Build/6.1.E.3.7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; SGPT13 Build/TJDS0170) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; ja-jp; SonySO-03E Build/10.1.E.0.265) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.2', 'Build' => '10.1.E.0.265', 'Webkit' => '534.30', 'Safari' => '4.0') ), + 'Mozilla/5.0 (Linux; Android 4.1.2; LT26w Build/6.2.B.1.96) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; SGP321 Build/10.3.1.A.0.33) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => '10.3.1.A.0.33', 'Webkit' => '537.31', 'Chrome' => '26.0.1410.58') ), + 'Mozilla/5.0 (Linux; Android 4.3; C5303 Build/12.1.A.1.205) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; XL39h Build/14.2.A.1.136) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; sv-se; C5503 Build/10.1.1.A.1.273) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; C5502 Build/10.1.1.A.1.310) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; SonyL39t Build/14.1.M.0.202) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; L39u Build/14.1.n.0.63) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; zh-tw; M35c Build/12.0.B.5.37) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.1.2; M35c Build/12.0.B.2.42) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; zh-CN; M35t Build/12.0.C.2.42) AppleWebKit/534.31 (KHTML, like Gecko) UCBrowser/9.3.2.349 U3/0.8.0 Mobile Safari/534.31' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; D6502 Build/17.1.A.2.69) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; D6503 Build/17.1.A.0.504) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; D6543 Build/17.1.A.2.55) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; D2004 Build/20.0.A.0.29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; en-gb; D2005 Build/20.0.A.1.12) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; D2104 Build/20.0.B.0.84) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; D2105 Build/20.0.B.0.74) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.170 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; pt-br; D2114 Build/20.0.B.0.85) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; D2302 Build/18.0.B.1.23) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; S50h Build/18.0.b.1.23) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.6.3.413 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; D2303 Build/18.0.C.1.13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; D2305 Build/18.0.A.1.30) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; D2306 Build/18.0.C.1.7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; D5303 Build/19.0.1.A.0.207) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; D5306 Build/19.1.A.0.264) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; zh-CN; XM50h Build/19.0.D.0.269) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.7.6.428 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; XM50t Build/19.0.C.2.59) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; D5322 Build/19.0.D.0.253) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; M51w Build/14.2.A.1.146) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.3; M51w Build/14.2.A.1.146) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.1; D5102 Build/18.2.A.0.9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.1; D5103 Build/18.1.A.0.11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.1; D5106 Build/18.1.A.0.11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.3; en-gb; C6902 Build/14.2.A.1.136) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 GSA/3.2.17.1009776.arm' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; es-es; C6943 Build/14.1.G.2.257) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; C6943 Build/14.3.A.0.681) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.2.2; SGP412 Build/14.1.B.3.320) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; SonySGP321 Build/10.2.C.0.143) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.1.2; SGP351 Build/10.1.1.A.1.307) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.3; SGP341 Build/10.4.B.0.569) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; SGP511 Build/17.1.A.2.36) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; SGP512 Build/17.1.A.2.36) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; fr-ch; SGP311 Build/10.1.C.0.344) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; SGP312 Build/10.1.C.0.344) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.4.2; de-de; SGP521 Build/17.1.A.2.69) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Safari/537.16' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.4.2; zh-cn; SGP541 Build/17.1.A.2.36) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.4.2; SGP551 Build/17.1.A.2.72) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'SonyEricssonU5i/R2CA; Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 Safari/525' => array('isMobile' => true, 'isTablet' => false), + 'SonyEricssonU5i/R2AA; Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 Safari/525' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/4.0 (PDA; PalmOS/sony/model prmr/Revision:1.1.54 (en)) NetFront/3.0' => array('isMobile' => true, 'isTablet' => false), + 'Opera/9.80 (Linux mips; U; InettvBrowser/2.2 (00014A;SonyDTV115;0002;0100) KDL40EX720; CC/BEL; en) Presto/2.7.61 Version/11.00' => array('isMobile' => false, 'isTablet' => false), + 'Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-ve; SonyST21a2 Build/11.0.A.6.5) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.2; D2533 Build/19.2.A.0.391) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; Android 4.4.4; Xperia SP Build/KTU84Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla / 5.0 (Linux; Android 5.0.2; SOT31 Build / 28.0.D.6.71) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 39.0.2171.93 Safari / 537.36' => array('isMobile' => true, 'isTablet' => true), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/SpecialCases.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/SpecialCases.php new file mode 100644 index 00000000000..363aac9fcc1 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/SpecialCases.php @@ -0,0 +1,206 @@ + array( + 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; Avant Browser; rv:11.0) like Gecko' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Windows NT 6.1; WOW64; Avant TriCore) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Windows NT 5.1; rv:27.0; Avant TriCore) Gecko/20100101 Firefox/27.0' => array('isMobile' => false, 'isTablet' => false), + ), + 'Console' => array( + + //Nintendo Wii: + 'Mozilla/5.0 (Nintendo WiiU) AppleWebKit/536.28 (KHTML, like Gecko) NX/3.0.3.12.14 NintendoBrowser/3.1.1.9577.EU' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Nintendo WiiU) AppleWebKit/534.52 (KHTML, like Gecko) NX/{Version No} NintendoBrowser/{Version No}.US' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7567.US' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7498.US' => array('isMobile' => true, 'isTablet' => false), + //Sony PlayStation: + 'Mozilla/5.0 (PLAYSTATION 3 4.21) AppleWebKit/531.22.8 (KHTML, like Gecko)' => array('isMobile' => false, 'isTablet' => false), + //Microsoft Xbox: + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Xbox)' => array('isMobile' => false, 'isTablet' => false), + // WTF? Must investigate. + //'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Xbox)' => array('isMobile' => false, 'isTablet' => false), + + ), + + 'Other' => array( + // Unknown + 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SV1; [eburo v4.0]; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3; .NET4.0C; .NET4.0E)' => array('isMobile' => false, 'isTablet' => false), + + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10) AppleWebKit/600.1.25 (KHTML, like Gecko) Version/8.0 Safari/600.1.25' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), + + // @todo 3Q - http://3q-int.com/en/download/tablets7/ + //'Mozilla/5.0 (Linux; U; Android 4.0.4; it-it; MT0729B Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, + //'Mozilla/5.0 (Linux; U; Android 4.0.4; uk-us; RC9716B Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, + + // Sogou Explorer (Browser) + //'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 SE 2.X MetaSr 1.0' => null, + //'Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; SV1; SE 2.x)' => null, + + 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Iron/37.0.2000.0 Chrome/37.0.2000.0 Safari/537.36' => array('isMobile' => false, 'isTablet' => false, 'version' => array('Iron' => '37.0.2000.0')), + // Liebao Browser + //'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER', + 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.102 Chrome/32.0.1700.102 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0 AlexaToolbar/psPCtGhf-2.2' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (X11; Linux ppc; rv:17.0) Gecko/20130626 Firefox/17.0 Iceweasel/17.0.7' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (X11; Linux) AppleWebKit/535.22+ Midori/0.4' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-us) AppleWebKit/535+ (KHTML, like Gecko) Version/5.0 Safari/535.20+ Midori/0.4' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.20 Safari/537.36 OPR/15.0.1147.18 (Edition Next)' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Windows NT 5.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0' => array('isMobile' => false, 'isTablet' => false), + 'Opera/9.80 (Windows NT 5.2; WOW64) Presto/2.12.388 Version/12.14' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (X11; FreeBSD amd64; rv:14.0) Gecko/20100101 Firefox/14.0.1' => array('isMobile' => false, 'isTablet' => false), + // @todo Inspect https://gist.githubusercontent.com/pongacm/b7775bebf2b26c09e1f8/raw/0aff83747959386663f3a5c68d7f7150764a8e2d/Varnish%20-%20Tablet%20PC%20(TAB) + // https://github.com/varnish/varnish-devicedetect/issues/19 + 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Win64; x64; Trident/6.0; Touch; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Tablet PC 2.0; MASMJS)' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; MANMJS)' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; MASMJS)' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch; MASMJS)' => array('isMobile' => false, 'isTablet' => false), + 'Opera/9.80 (Windows NT 6.2; WOW64; MRA 8.0 (build 5784)) Presto/2.12.388 Version/12.11' => array('isMobile' => false, 'isTablet' => false), + // IE 10 + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)' => array('isMobile' => false, 'isTablet' => false), + // IE 11 @todo: Trident(.*)rv.(\d+)\.(\d+) + 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko' => array('isMobile' => false, 'isTablet' => false), + + // TV + 'Mozilla/5.0 (Unknown; Linux armv7l) AppleWebKit/537.1+ (KHTML, like Gecko) Safari/537.1+ HbbTV/1.1.1 ( ;LGE ;NetCast 4.0 ;03.20.30 ;1.0M ;)' => array('isMobile' => false, 'isTablet' => false), + 'HbbTV/1.1.1 (;Panasonic;VIERA 2012;1.261;0071-3103 2000-0000;)' => array('isMobile' => false, 'isTablet' => false), + 'Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11' => array('isMobile' => false, 'isTablet' => false), + ), + + 'TV' => array( + //'Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.2.1; en) Presto/2.6.33 Version/10.70' => null + ), + + 'Generic' => array( + + 'Mozilla/5.0 (Linux; U; Jolla; Sailfish; Mobile; rv:20.0) Gecko/20.0 Firefox/20.0 Sailfish Browser/1.0 like Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + + // Generic Firefox User-agents + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Gecko_user_agent_string_reference#Firefox_OS + 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Tablet; rv:26.0) Gecko/26.0 Firefox/26.0' => array('isMobile' => true, 'isTablet' => true), + + // Facebook WebView + //'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D201 [FBAN/FBIOS;FBAV/12.1.0.24.20;FBBV/3214247;FBDV/iPhone6,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/7.1.1;FBSS/2; FBCR/AT&T;FBID/phone;FBLC/en_US;FBOP/5]' => null, + + // Outlook + //'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3; IM-2014-026; IM-2014-043; Microsoft Outlook 14.0.7113; ms-office; MSOffice 14)' => null, + + // Carrefour tablet + 'Mozilla/5.0 (Linux; Android 4.2.2; CT1020W Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + + // @comment: Pipo m6pro tablet + 'Mozilla/5.0 (Linux; Android 4.2.2; M6pro Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + + // https://github.com/varnish/varnish-devicedetect/issues/17 + // To be researched. + 'MobileSafari/9537.53 CFNetwork/672.1.13 Darwin/13.1.0' => array('isMobile' => true, 'isTablet' => false), + 'Appcelerator Titanium/3.2.2.GA (iPod touch/6.1.6; iPhone OS; en_US;)' => array('isMobile' => true, 'isTablet' => false), + + 'Opera Coast/3.0.3.78307 CFNetwork/672.1.15 Darwin/14.0.0' => array('isMobile' => true, 'isTablet' => false), + + 'Mozilla/5.0 (Linux; Android 4.0.3; ALUMIUM10 Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.2.1; en-us; JY-G3 Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; hu-hu; M758A Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + + 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; EVOTAB Build/IMM76I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Java/1.6.0_22' => array('isMobile' => false, 'isTablet' => false, 'version' => array('Java' => '1.6.0_22') ), + 'Opera/9.80 (Series 60; Opera Mini/6.5.29260/29.3417; U; ru) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), + 'Opera/9.80 (Android; Opera Mini/6.5.27452/29.3417; U; ru) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), + 'Opera/9.80 (iPhone; Opera Mini/7.1.32694/27.1407; U; en) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), + // New Opera + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17 OPR/14.0.1025.52315' => array('isMobile' => false, 'isTablet' => false), + // Unknown yet + // Looks like Chromebook + //'Mozilla/5.0 (X11; CrOS armv7l 4920.83.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.103 Safari/537.36' => null, + 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5' => array('isMobile' => true, 'isTablet' => false), + 'Opera/9.80 (Android 2.3.7; Linux; Opera Mobi/46154) Presto/2.11.355 Version/12.10' => array('isMobile' => true, 'isTablet' => false), + //'Mozilla/5.0 (Linux; U; Android 4.0.3; it-it; DATAM819HD_C Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, + //'Mozilla/5.0 (Linux; U; Android 4.0.3; nl-nl; SGPT12 Build/TID0142) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, + //'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; cm_tenderloin Build/IMM76L; CyanogenMod-9) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, + + //'Mozilla/5.0 (Linux; U; Android 4.1.1; fr-fr; A210 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, // Acer Iconia Tab + 'Mozilla/5.0 (iPad; CPU OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B141 Safari/8536.25' => array('isMobile' => true, 'isTablet' => true), + //'Mozilla/5.0 (Linux; U; Android 2.3.6; en-gb; GT-I8150 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => null, + //'Mozilla/5.0 (iPad; CPU OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mercury/7.2 Mobile/10A523 Safari/8536.25' => null, // Mercurio Browser + //'Opera/9.80 (Android 2.3.7; Linux; Opera Tablet/46154) Presto/2.11.355 Version/12.10' => null, + 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; sdk Build/MASTER) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => false), // sdk + 'Mozilla/5.0 (Linux; U; Android 4.2; en-us; sdk Build/JB_MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), // sdk + + //'Opera/9.80 (X11; Linux zbov) Presto/2.11.355 Version/12.10' => null, + //'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; TOUCHPAD 7 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => null, // 7" Verso Android tablet + //'Mozilla/5.0 (iPhone; U; CPU OS 4_2_1 like Mac OS X) AppleWebKit/532.9 (KHTML, like Gecko) Version/5.0.3 Mobile/8B5097d Safari/6531.22.7' => null, + //'Mozilla/5.0 (Linux; U; Android 4.0.3; en-gb; SGPT12 Build/TID0142) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, // sony xperia tablet s unforts + //'Mozilla/5.0 (Linux; U; Android 2.0.6_b1; ru-ru Build/ECLAIR) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => null, // PocketBook IQ701 (tablet) + //'Mozilla/5.0 (Linux; Android 4.0.4; z1000 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => null, // It is a tablet with calling + //'Mozilla/5.0 (Linux; Android 4.0.3; cm_tenderloin Build/GWK74) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => null, // HP touch pad running android cyanogenmod + //'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; Android for Techvision TV1T808 Board Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => null, // My device is tablet but its detected as phone + //'BlackBerry8520/5.0.0.592 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/136' => null, + //'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17' => null, // its a lenovo tablet 2 with windows 8 pro + //'Mozilla/5.0 (Linux; U; Android 3.1; ru-ru; LG-V900 Build/HMJ37) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => null, + //'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; HTC; Windows Phone 8S by HTC)' => null, + //'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)' => null, // MS Surface RT tablet actually! + //'Mozilla/5.0 (PLAYSTATION 3 4.11) AppleWebKit/531.22.8 (KHTML, like Gecko)' => null, + //'Mozilla/5.0 (Linux; U; Android 3.2; ru-ru; V9S_V1.4) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => null, // Wrong detection - 7-inch tablet was detected as a phone. Android 3.2.1, native browser + //'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)' => null, // Nope, its a Microsoft Surface tablet running Windows RT (8) with MSIE 10 + //'Mozilla/5.0 (Linux; U; Android 2.2; es-es; Broncho N701 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => null, // Tablet! + //'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)' => null, // its a Microsoft surface rt (tablet) + //'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch; WebView/1.0)' => null, + //'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; Next7P12 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => null, // Nextbook 7SE Tablet + //'Opera/9.80 (X11; Linux zbov) Presto/2.11.355 Version/12.10' => null, // allview alldro speed tablet, android ics, opera mobile + //'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)' => null, // Its a surface in portrait + // Am ramas la pozitia: 207 + + // Android on Windows :) www.socketeq.com + //'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; full Android on Microsoft Windows, pad, pc, n*books Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, + + // TV + //'Opera/9.80 (Linux mips; U; InettvBrowser/2.2 (00014A;SonyDTV115;0002;0100) KDL40EX720; CC/BEL; en) Presto/2.7.61 Version/11.00' => null, + + 'Mozilla/5.0 (Android; Mobile; rv:18.0) Gecko/18.0 Firefox/18.0' => array('isMobile' => true, 'isTablet' => false), + // Maxthon + 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.12 (KHTML, like Gecko) Maxthon/3.0 Chrome/18.0.966.0 Safari/535.12' => array('isMobile' => false, 'isTablet' => false), + 'Opera/9.80 (Windows NT 5.1; U; Edition Yx; ru) Presto/2.10.289 Version/12.02' => array('isMobile' => false, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2; en-us; sdk Build/JB_MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Windows Phone 6.5.3.5)' => array('isMobile' => true, 'isTablet' => false), + 'PalmCentro/v0001 Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/Palm-D061; Blazer/4.5) 16;320x320' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Microsoft; XDeviceEmulator)' => array('isMobile' => true, 'isTablet' => false), + // ZTE phone + 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; MAL; N880E; China Telecom)' => array('isMobile' => true, 'isTablet' => false), + 'Opera/9.80 (Series 60; Opera Mini/7.0.29482/28.2859; U; ru) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), + 'Opera/9.80 (S60; SymbOS; Opera Mobi/SYB-1202242143; U; en-GB) Presto/2.10.254 Version/12.00' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-au; 97D Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Opera/9.80 (Android; Opera Mini/7.0.29952/28.2647; U; ru) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), + 'Opera/9.80 (Android; Opera Mini/6.1.25375/28.2555; U; en) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), + 'Opera/9.80 (Mac OS X; Opera Tablet/35779; U; en) Presto/2.10.254 Version/12.00' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Android; Tablet; rv:10.0.4) Gecko/10.0.4 Firefox/10.0.4 Fennec/10.0.4' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Android; Tablet; rv:18.0) Gecko/18.0 Firefox/18.0' => array('isMobile' => true, 'isTablet' => true), + 'Opera/9.80 (Linux armv7l; Maemo; Opera Mobi/14; U; en) Presto/2.9.201 Version/11.50' => array('isMobile' => true, 'isTablet' => false), + 'Opera/9.80 (Android 2.2.1; Linux; Opera Mobi/ADR-1207201819; U; en) Presto/2.10.254 Version/12.00' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; sdk Build/JRO03E) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; Endeavour 1010 Build/ONDA_MID) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), // Blaupunkt Endeavour 1010 + 'Mozilla/5.0 (Linux; U; Android 4.0.4; de-de; Tablet-PC-4 Build/ICS.g08refem618.20121102) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + // Tagi tablets + 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; Tagi Tab S10 Build/8089) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + ), + + 'Bot' => array( + 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), + 'grub-client-1.5.3; (grub-client-1.5.3; Crawl your own stuff with http://grub.org)' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), + 'Googlebot-Image/1.0' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), + 'Python-urllib/2.5' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), + 'facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), + 'AdsBot-Google (+http://www.google.com/adsbot.html)' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), + 'AdsBot-Google-Mobile (+http://www.google.com/mobile/adsbot.html) Mozilla (iPhone; U; CPU iPhone OS 3 0 like Mac OS X) AppleWebKit (KHTML, like Gecko) Mobile Safari' => array('isMobile' => true, 'isTablet' => false, /*'isBot' => true*/), + 'Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko, Google Keyword Suggestion) Chrome/10.0.648.127 Safari/534.16' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), + 'Facebot' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/) + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Vodafone.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Vodafone.php new file mode 100644 index 00000000000..2074a041de0 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Vodafone.php @@ -0,0 +1,11 @@ + array( + 'Mozilla/5.0 (Linux; U; Android 3.2; hu-hu; SmartTab10-MSM8260-V02d-Dec022011-Vodafone-HU) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; Android 4.0.3; SmartTabII10 Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.1.1; fr-fr; SmartTAB 1002 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), + 'Mozilla/5.0 (Linux; U; Android 4.0.4; de-de, SmartTabII7 Build/A2107A_A404_107_055_130124_VODA) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( + 'isMobile' => true, 'isTablet' => true, + ), + ), +); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/ZTE.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/ZTE.php new file mode 100644 index 00000000000..4f29b7a633b --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/ZTE.php @@ -0,0 +1,6 @@ + array( + 'Mozilla/5.0 (Linux; Android 4.0.4; V8200plus Build/IMM76I) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false) + ) +); \ No newline at end of file diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/ualist.json b/htdocs/includes/mobiledetect/mobiledetectlib/tests/ualist.json index c8b6db5b3ee..165832d6e6f 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/ualist.json +++ b/htdocs/includes/mobiledetect/mobiledetectlib/tests/ualist.json @@ -1 +1,8196 @@ -{"hash":"0f2ce8fdb263e38dc366cecd67ec5ac87ad4c637","user_agents":[{"vendor":"Acer","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.2.1; en-us; A100 Build\/HTK55D) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13","mobile":true,"tablet":true},{"vendor":"Acer","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1; en-us; A110 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Acer","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; A200 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.0.3","Webkit":"534.30","Safari":"4.0","Build":"IML74K"},"model":"A200"},{"vendor":"Acer","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; A500 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Acer","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; A501 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Acer","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; A701 Build\/JRO03H) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"Acer","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; B1-A71 Build\/JZO54K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"Acer","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; B1-710 Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Acer","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; A1-810 Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Safari\/537.31","mobile":true,"tablet":true},{"vendor":"Acer","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; nl-nl; A1-810 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Acer","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Acer; Allegro)","mobile":true,"tablet":false},{"vendor":"Acer","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; A3-A10 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.36","mobile":true,"tablet":true,"version":{"Android":"4.2.2","Build":"JDQ39","Webkit":"537.36","Chrome":"32.0.1700.99"}},{"vendor":"Acer","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; A1-830 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"AdvanDigital","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; E1C Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":true},{"vendor":"AdvanDigital","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; id-id; T3C Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Ainol","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.4; en-us; Ainol Novo8 Advanced Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"Ainol","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; Novo10 Hero Build\/20121115) AppleWebKit\/535.19 (KHTML like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"Ainol","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; es-es; novo9-Spark Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"AllFine","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; FINE7 GENIUS Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"ASUS","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.2.1; en-us; Transformer TF101 Build\/HTK75) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13","mobile":true,"tablet":true,"version":{"Android":"3.2.1","Webkit":"534.13","Safari":"4.0"},"model":"Transformer TF101"},{"vendor":"ASUS","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; Transformer Build\/JRO03L) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"ASUS","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; ASUS Transformer Pad TF300T Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"ASUS","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; fr-fr; Transformer Build\/JZO54K; CyanogenMod-10) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"ASUS","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; asus_laptop Build\/IMM76L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":false},{"vendor":"ASUS","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; PadFone 2 Build\/JRO03L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"ASUS","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; PadFone 2 Build\/JRO03L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.1.1","Build":"JRO03L","Webkit":"534.30","Safari":"4.0"}},{"vendor":"ASUS","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.1; ME301T Build\/JOP40D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36","mobile":true,"tablet":true,"version":{"Android":"4.2.1","Build":"JOP40D"}},{"vendor":"ASUS","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.1; ME173X Build\/JOP40D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36","mobile":true,"tablet":true,"version":{"Android":"4.2.1","Build":"JOP40D"}},{"vendor":"ASUS","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; TF300T Build\/JDQ39E) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true,"version":{"Android":"4.2.2","Build":"JDQ39E"}},{"vendor":"Alcatel","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.7; en-in; MB525 Build\/GWK74; CyanogenMod-7.2.0) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Alcatel","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.5; it-it; ALCATEL ONE TOUCH 918D Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false,"version":{"Android":"2.3.5","Webkit":"533.1","Safari":"4.0","Build":"GRJ90"},"model":"ONE TOUCH 918D"},{"vendor":"Alcatel","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; ALCATEL ONE TOUCH 991 Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false,"version":{"Android":"2.3.6","Webkit":"533.1","Safari":"4.0","Build":"GRJ90"},"model":"ONE TOUCH 991"},{"vendor":"Alcatel","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; ALCATEL ONE TOUCH 993D Build\/ICECREAM) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false,"version":{"Android":"4.0.4","Webkit":"534.30","Safari":"4.0","Build":"ICECREAM"},"model":"ONE TOUCH 993D"},{"vendor":"Allview","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; ALLVIEW P5 Build\/IML74K) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Allview","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us ; ALLVIEW SPEEDI Build\/IMM76D) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1\/UCBrowser\/8.5.3.246\/145\/355","mobile":true,"tablet":true},{"vendor":"Allview","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; AllviewCity Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Allview","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; ALLVIEWSPEED Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Amazon","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Silk\/3.4 Mobile Safari\/535.19 Silk-Accelerated=true","mobile":true,"tablet":true},{"vendor":"Amazon","user_agent":"Mozilla\/5.0 (Linux; U; en-US) AppleWebKit\/528.5+ (KHTML, like Gecko, Safari\/528.5+) Version\/4.0 Kindle\/3.0 (screen 600x800; rotate)","mobile":true,"tablet":true,"version":{"Webkit":"528.5+","Kindle":"3.0","Safari":"4.0"},"model":"Kindle"},{"vendor":"Amazon","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; KFOTE Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.0.3","Build":"IML74K","Webkit":"534.30","Safari":"4.0"}},{"vendor":"Amazon","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; WFJWAE Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Apple","user_agent":"iTunes\/9.1.1","mobile":false,"tablet":false},{"vendor":"Apple","user_agent":"iTunes\/11.0.2 (Windows; Microsoft Windows 8 x64 Business Edition (Build 9200)) AppleWebKit\/536.27.1","mobile":false,"tablet":false},{"vendor":"Apple","user_agent":"Mozilla\/5.0 (iPod touch; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit\/537.51.1 (KHTML, like Gecko) Version\/7.0 Mobile\/11A4449d Safari\/9537.53","mobile":true,"tablet":false},{"vendor":"Apple","user_agent":"Mozilla\/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit\/420+ (KHTML, like Gecko) Version\/3.0 Mobile\/1A543 Safari\/419.3","mobile":true,"tablet":false,"version":{"Webkit":"420+","Safari":"3.0"}},{"vendor":"Apple","user_agent":"Mozilla\/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit\/528.18 (KHTML, like Gecko) Version\/4.0 Mobile\/7A341 Safari\/528.16","mobile":true,"tablet":false,"version":{"iOS":"3_0","Webkit":"528.18","Safari":"4.0"},"model":"iPhone"},{"vendor":"Apple","user_agent":"Mozilla\/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit\/534.46 (KHTML, like Gecko) Version\/5.1 Mobile\/9B206 Safari\/7534.48.3","mobile":true,"tablet":false,"version":{"iOS":"5_1_1","Webkit":"534.46","Mobile":"9B206","Safari":"5.1"},"model":"iPhone"},{"vendor":"Apple","user_agent":"Mozilla\/5.0 (iPod; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Version\/6.0 Mobile\/10A403 Safari\/8536.25","mobile":true,"tablet":false,"version":{"iOS":"6_0","Webkit":"536.26","Mobile":"10A403","Safari":"6.0"},"model":"iPod"},{"vendor":"Apple","user_agent":"Mozilla\/5.0 (iPad; CPU OS 5_1_1 like Mac OS X; en-us) AppleWebKit\/534.46.0 (KHTML, like Gecko) CriOS\/21.0.1180.80 Mobile\/9B206 Safari\/7534.48.3 (6FF046A0-1BC4-4E7D-8A9D-6BF17622A123)","mobile":true,"tablet":true,"version":{"iOS":"5_1_1","Webkit":"534.46.0","Chrome":"21.0.1180.80","Mobile":"9B206"},"model":"iPad"},{"vendor":"Apple","user_agent":"Mozilla\/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Version\/6.0 Mobile\/10A403 Safari\/8536.25","mobile":true,"tablet":true,"version":{"iOS":"6_0","Webkit":"536.26","Safari":"6.0","Mobile":"10A403"},"model":"iPad"},{"vendor":"Apple","user_agent":"Mozilla\/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; en-us) AppleWebKit\/533.17.9 (KHTML, like Gecko) Version\/5.0.2 Mobile\/8C148 Safari\/6533.18.5","mobile":true,"tablet":true,"version":{"iOS":"4_2_1","Webkit":"533.17.9","Safari":"5.0.2","Mobile":"8C148"},"model":"iPad"},{"vendor":"Apple","user_agent":"Mozilla\/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit\/531.21.10 (KHTML, like Gecko) Version\/4.0.4 Mobile\/7B334b Safari\/531.21.10","mobile":true,"tablet":true,"version":{"iOS":"3_2","Webkit":"531.21.10","Safari":"4.0.4","Mobile":"7B334b"},"model":"iPad"},{"vendor":"Apple","user_agent":"Mozilla\/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X; da-dk) AppleWebKit\/534.46.0 (KHTML, like Gecko) CriOS\/21.0.1180.82 Mobile\/10A523 Safari\/7534.48.3","mobile":true,"tablet":false,"version":{"iOS":"6_0_1","Webkit":"534.46.0","Chrome":"21.0.1180.82","Mobile":"10A523"},"model":"iPhone"},{"vendor":"Apple","user_agent":"Mozilla\/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Version\/6.0 Mobile\/10A523 Safari\/8536.25","mobile":true,"tablet":false,"version":{"iOS":"6_0_1","Webkit":"536.26","Safari":"6.0","Mobile":"10A523"},"model":"iPhone"},{"vendor":"Apple","user_agent":"Mozilla\/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X; ru-ru) AppleWebKit\/536.26 (KHTML, like Gecko) CriOS\/23.0.1271.100 Mobile\/10B142 Safari\/8536.25","mobile":true,"tablet":false,"version":{"iOS":"6_1","Webkit":"536.26","Chrome":"23.0.1271.100","Mobile":"10B142"},"model":"iPhone"},{"vendor":"Apple","user_agent":"Mozilla\/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Version\/6.0 Mobile\/10B329 Safari\/8536.25","mobile":true,"tablet":false,"version":{"iOS":"6_1_3","Webkit":"536.26","Safari":"6.0","Mobile":"10B329"},"model":"iPhone"},{"vendor":"Apple","user_agent":"Mozilla\/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Coast\/1.0.2.62956 Mobile\/10B329 Safari\/7534.48.3","mobile":true,"tablet":true,"version":{"Coast":"1.0.2.62956"}},{"vendor":"Archos","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; Qilive 97R Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Archos","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; Archos 50 Platinum Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Archos","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.4; ARCHOS 80G9 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"Archos","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2.1; fr-fr; A101IT Build\/FROYO) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"Archos","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; Archos 101 Neon Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"AudioSonic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-au; T-17B Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (BlackBerry; U; BlackBerry 9300; en) AppleWebKit\/534.8+ (KHTML, like Gecko) Version\/6.0.0.546 Mobile Safari\/534.8+","mobile":true,"tablet":false,"version":{"Webkit":"534.8+","BlackBerry":"6.0.0.546"},"model":"BlackBerry 9300"},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (BlackBerry; U; BlackBerry 9360; en-US) AppleWebKit\/534.11+ (KHTML, like Gecko) Version\/7.0.0.400 Mobile Safari\/534.11+","mobile":true,"tablet":false},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (BlackBerry; U; BlackBerry 9700; he) AppleWebKit\/534.8+ (KHTML, like Gecko) Version\/6.0.0.723 Mobile Safari\/534.8+","mobile":true,"tablet":false},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (BlackBerry; U; BlackBerry 9700; en-US) AppleWebKit\/534.8 (KHTML, like Gecko) Version\/6.0.0.448 Mobile Safari\/534.8","mobile":true,"tablet":false},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (BlackBerry; U; BlackBerry 9790; en-GB) AppleWebKit\/534.11+ (KHTML, like Gecko) Version\/7.1.0.714 Mobile Safari\/534.11+","mobile":true,"tablet":false,"version":{"Webkit":"534.11+","BlackBerry":"7.1.0.714"},"model":"BlackBerry 9790"},{"vendor":"BlackBerry","user_agent":"Opera\/9.80 (BlackBerry; Opera Mini\/7.0.29990\/28.2504; U; en) Presto\/2.8.119 Version\/11.10","mobile":true,"tablet":false},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (BlackBerry; U; BlackBerry 9981; en-GB) AppleWebKit\/534.11+ (KHTML, like Gecko) Version\/7.1.0.342 Mobile Safari\/534.11+","mobile":true,"tablet":false},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (BlackBerry; U; BlackBerry 9800; en-GB) AppleWebKit\/534.8+ (KHTML, like Gecko) Version\/6.0.0.546 Mobile Safari\/534.8+","mobile":true,"tablet":false},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (BlackBerry; U; BlackBerry 9780; es) AppleWebKit\/534.8 (KHTML, like Gecko) Version\/6.0.0.480 Mobile Safari\/534.8","mobile":true,"tablet":false},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (BlackBerry; U; BlackBerry 9810; en-US) AppleWebKit\/534.11 (KHTML, like Gecko) Version\/7.0.0.583 Mobile Safari\/534.11","mobile":true,"tablet":false},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (BlackBerry; U; BlackBerry 9860; es) AppleWebKit\/534.11+ (KHTML, like Gecko) Version\/7.0.0.576 Mobile Safari\/534.11+","mobile":true,"tablet":false},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit\/534.11 (KHTML, like Gecko) Version\/7.1.0.523 Mobile Safari\/534.11","mobile":true,"tablet":false},{"vendor":"BlackBerry","user_agent":"BlackBerry8520\/5.0.0.592 Profile\/MIDP-2.1 Configuration\/CLDC-1.1 VendorID\/136","mobile":true,"tablet":false},{"vendor":"BlackBerry","user_agent":"BlackBerry8520\/5.0.0.1067 Profile\/MIDP-2.1 Configuration\/CLDC-1.1 VendorID\/603","mobile":true,"tablet":false},{"vendor":"BlackBerry","user_agent":"BlackBerry8520\/5.0.0.1036 Profile\/MIDP-2.1 Configuration\/CLDC-1.1 VendorID\/611","mobile":true,"tablet":false,"version":{"BlackBerry":"5.0.0.1036","VendorID":"611"},"model":"BlackBerry8520"},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (BlackBerry; U; BlackBerry 9220; en) AppleWebKit\/534.11+ (KHTML, like Gecko) Version\/7.1.0.337 Mobile Safari\/534.11+","mobile":true,"tablet":false},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit\/536.2+ (KHTML, like Gecko) Version\/7.2.1.0 Safari\/536.2+","mobile":true,"tablet":true},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (BB10; Touch) AppleWebKit\/537.1+ (KHTML, like Gecko) Version\/10.0.0.1337 Mobile Safari\/537.1+","mobile":true,"tablet":false},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (BB10; Touch) AppleWebKit\/537.10+ (KHTML, like Gecko) Version\/10.0.9.2372 Mobile Safari\/537.10+","mobile":true,"tablet":false},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (BB10; Touch) \/537.10+ (KHTML, like Gecko) Version\/10.0.9.2372 Mobile Safari\/537.10+","mobile":true,"tablet":false,"version":{"BlackBerry":"10.0.9.2372"}},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.2.1; en-us; Transformer TF101 Build\/HTK75) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13","mobile":true,"tablet":true,"version":{"Android":"3.2.1","Webkit":"534.13","Safari":"4.0"},"model":"Transformer TF101"},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; A200 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.0.3","Webkit":"534.30","Safari":"4.0"},"model":"A200"},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; A500 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.0.3","Webkit":"534.30","Safari":"4.0"},"model":"A500"},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; A501 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.0.3","Webkit":"534.30","Safari":"4.0"},"model":"A501"},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; Transformer Build\/JRO03L) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true,"version":{"Android":"4.1.1","Webkit":"535.19","Chrome":"18.0.1025.166"},"model":"Transformer"},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; ASUS Transformer Pad TF300T Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true,"version":{"Android":"4.1.1","Webkit":"535.19","Chrome":"18.0.1025.166"},"model":"Transformer Pad TF300T"},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; fr-fr; Transformer Build\/JZO54K; CyanogenMod-10) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.1.2","Webkit":"534.30","Safari":"4.0","Build":"JZO54K"},"model":"Transformer"},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; B1-A71 Build\/JZO54K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true,"version":{"Android":"4.1.2","Webkit":"535.19","Chrome":"18.0.1025.166"},"model":"B1-A71"},{"vendor":"BlackBerry","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Acer; Allegro)","mobile":true,"tablet":false,"version":{"Windows Phone OS":"7.5","Trident":"5.0","IE":"9.0"},"model":"Allegro"},{"vendor":"Broncho","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2; es-es; Broncho N701 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"bq","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; es-es; bq Livingstone 2 Build\/1.1.7 20121018-10:33) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"bq","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; es-es; bq Edison Build\/1.1.10-1015 20121230-18:00) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"bq","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.3; Maxwell Lite Build\/v1.0.0.ICS.maxwell.20120920) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"bq","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; zh-tw; bq Maxwell Plus Build\/1.0.0 20120913-10:39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Captiva","user_agent":"Opera\/9.80 (X11; Linux zvav; U; de) Presto\/2.8.119 Version\/11.10 Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; CAPTIVA PAD 10.1 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Casio","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us; C771 Build\/C771M120) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"ChangJia","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; pt-br; TPC97113 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"ChangJia","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; TPC7102 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Coby","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2; en-us; MID7010 Build\/FRF85B) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"Coby","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; MID7048 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Coby","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; MID8042 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Concorde","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; hu-hu; ConCorde Tab T10 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Concorde","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; hu-hu; ConCorde tab PLAY Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Cresta","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; nl-nl; CRESTA.CTP888 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Cube","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; ru-ru; CUBE U9GT 2 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Danew","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; es-es; Dslide 700 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.0.3","Build":"IML74K","Webkit":"534.30","Safari":"4.0"},"model":"Dslide 700"},{"vendor":"DanyTech","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; Genius Tab Q4 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Dell","user_agent":"Mozilla\/5.0 (Linux; U; Android 1.6; en-gb; Dell Streak Build\/Donut AppleWebKit\/528.5+ (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/ 525.20.1","mobile":true,"tablet":false},{"vendor":"Dell","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.7; hd-us; Dell Venue Build\/GWK74; CyanogenMod-7.2.0) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Dell","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; DELL; Venue Pro)","mobile":true,"tablet":false},{"vendor":"DPS","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; DPS Dream 9 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"ECS","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; it-it; TM105A Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.0.4","Build":"IMM76D","Webkit":"534.30"}},{"vendor":"Eboda","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Supreme Dual Core X190 Build\/JRO03C) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.1.1","Webkit":"534.30","Safari":"4.0"}},{"vendor":"Eboda","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Essential A160 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Eboda","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.3; E-Boda Supreme X80 Dual Core Build\/ICS.g12refM806A1YBD.20120925) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"Eboda","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; ro-ro; E-boda essential smile Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Fly","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; Fly IQ440; Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Fly","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; FLY IQ256 Build\/GRK39F) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Fujitsu","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; ja-jp; F-10D Build\/V21R48A) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.0.3","Build":"V21R48A","Webkit":"534.30","Safari":"4.0"}},{"vendor":"Fujitsu","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; ru-ru; M532 Build\/IML74K) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.0.3","Build":"IML74K","Webkit":"534.30","Safari":"4.0"}},{"vendor":"FX2","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; FX2 PAD7 RK Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Galapad","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-tw; G1 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.1.1","Webkit":"534.30","Safari":"4.0","Build":"JRO03C"}},{"vendor":"GoClever","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; el-gr; GOCLEVER TAB A103 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"GoClever","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.4; zh-tw; A7GOCLEVER Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"GoClever","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.4; GOCLEVER TAB A104 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"GoClever","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; cs-cz; GOCLEVER TAB A93.2 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"GoClever","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; sk-sk; GOCLEVER TAB A971 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"GoClever","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; lv-lv; GOCLEVER TAB A972BK Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"GoClever","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; fr-fr; GOCLEVER TAB A104.2 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"GoClever","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; pt-pt; GOCLEVER TAB T76 Build\/MID) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Google","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Google","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; Nexus 4 Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.40 Mobile Safari\/537.31 OPR\/14.0.1074.54070","mobile":true,"tablet":false,"version":{"Android":"4.2.2","Build":"JDQ39","Webkit":"537.31","Opera":"14.0.1074.54070"}},{"vendor":"Google","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; Nexus 4 Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31","mobile":true,"tablet":false,"version":{"Android":"4.2.2","Chrome":"26.0.1410.58"}},{"vendor":"Google","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; Google Nexus 4 - 4.1.1 - API 16 - 768x1280 Build\/JRO03S) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Google","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; Google Galaxy Nexus - 4.1.1 - API 16 - 720x1280 Build\/JRO03S) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Google","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; Nexus 7 Build\/JRO03D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"Google","user_agent":"Mozilla\/5.0 (Linux; Android 4.2; Nexus 7 Build\/JOP40C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"Google","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; Nexus 7 Build\/JZ054K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true,"version":{"Android":"4.1.2","Chrome":"18.0.1025.166"}},{"vendor":"Google","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; cs-cz; Nexus S Build\/JZO54K; CyanogenMod-10.0.0) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Google","user_agent":"Mozilla\/5.0 (Linux; Android 4.3; Nexus 10 Build\/JWR66Y) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Google","user_agent":"Mozilla\/5.0 (Linux; U; Android; en_us; Nexus 7 Build\/) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 NetFrontLifeBrowser\/2.3 Mobile (Dragonfruit)","mobile":true,"tablet":true},{"vendor":"GU","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; vi-vn; TX-A1301 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.0.4","Build":"IMM76D","Webkit":"534.30","Safari":"4.0"}},{"vendor":"GU","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; da-dk; Q702 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.0.3","Build":"IML74K","Webkit":"534.30","Safari":"4.0"}},{"vendor":"HCL","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; U1 Build\/HCL ME Tablet U1) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":true},{"vendor":"HCL","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; U1 Build\/HCL ME Tablet U1) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":true},{"vendor":"HCL","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; Connect-3G-2.0 Build\/HCL) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"HCL","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.3; pt-br; X1 Build\/HCL ME Tablet X1) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"HP","user_agent":"Mozilla\/5.0 (hp-tablet; Linux; hpwOS\/3.0.5; U; en-GB) AppleWebKit\/534.6 (KHTML, like Gecko) wOSBrowser\/234.83 Safari\/534.6 TouchPad\/1.0","mobile":true,"tablet":true},{"vendor":"HP","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; HP Slate 7 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"HP","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; HP Slate 7 Build\/JRO03H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"HP","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; HP 8 Build\/1.0.7_WW-FIR-13) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (X11; Linux x86_64; Z520m; en-ca) AppleWebKit\/534.24 (KHTML, like Gecko) Chrome\/11.0.696.34 Safari\/534.24","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"HTC_Touch_HD_T8282 Mozilla\/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 1.5; en-us; ADR6200 Build\/CUPCAKE) AppleWebKit\/528.5+ (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/525.20.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.1; xx-xx; Desire_A8181 Build\/ERE27) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.1-update1; de-de; HTC Desire 1.19.161.5 Build\/ERE27) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.1-update1; en-gb; HTC Desire Build\/ERE27) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2; fr-fr; HTC Desire Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2; en-dk; Desire_A8181 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2; xx-xx; 001HT Build\/FRF91) AppleWebKit\/525.10+ (KHTML, like Gecko) Version\/3.0.4 Mobile Safari\/523.12.2","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2; xx-xx; HTCA8180\/1.0 Android\/2.2 release\/06.23.2010 Browser\/WAP 2.0 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2.2; de-at; HTC Desire Build\/FRG83G) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2.2; en-sk; Desire_A8181 Build\/FRG83G) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3; xx-xx; HTC\/DesireS\/1.07.163.1 Build\/GRH78C) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.3; en-lv; HTC_DesireZ_A7272 Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.4; en-us; ADR6300 Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.5; en-gb; HTC\/DesireS\/2.10.161.3 Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC_DesireS_S510e Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.5; en-us; Inspire 4G Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.5; de-de; HTC Explorer A310e Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.5; en-gb; HTC_ChaCha_A810e Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.5; nl-nl; HTC_DesireHD_A9191 Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC Desire S Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.3; en-au; HTC Desire Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.5; de-de; HTC_DesireHD Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.5; ru-ua; HTC_WildfireS_A510e Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.7; en-us; HTC Vision Build\/GRI40; ILWT-CM7) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0; xx-xx; HTC_GOF_U\/1.05.161.1 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; hu-hu; HTC Sensation Z710e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; pl-pl; EVO3D_X515m Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; ru-ru; HTC_One_S Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; ru-ru; HTC_One_V Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; zh-cn; HTC_A320e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; zh-tw; HTC Desire V Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.3; PG86100 Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-nl; SensationXE_Beats_Z715e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; ADR6425LVW 4G Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.3; HTC One V Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; cs-ee; Sensation_Z710e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; HTC Evo 4G Build\/MIUI) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.4; Desire HD Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-my; HTC_One_X Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; it-it; IncredibleS_S710e Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; fr-fr; HTC_Desire_S Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; HTC Butterfly Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; EVO Build\/JRO03C) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.169 Mobile Safari\/537.22","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; HTCSensation Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC 7 Mozart T8698; QSD8x50)","mobile":true,"tablet":false,"version":{"IE":"9.0","Windows Phone OS":"7.5","Trident":"5.0"},"model":"7 Mozart T8698"},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 HTC MOZART)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Mondrian T8788)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Mozart T8698)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Mozart)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Mozart; Orange)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Pro T7576)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Pro)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Schubert T9292)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Surround)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Trophy T8686)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Trophy)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Eternity)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Gold)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; HD2 LEO)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; HD2)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; HD7 T9292)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; HD7)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; iPad 3)","mobile":true,"tablet":true},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; LEO)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Mazaa)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Mondrian)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Mozart T8698)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Mozart)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; mwp6985)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; PC40100)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; PC40200)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; PD67100)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; PI39100)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; PI86100)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar 4G)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar C110e)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar C110e; 1.08.164.02)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar C110e; 2.05.164.01)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar C110e; 2.05.168.02)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar; Orange)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Schuber)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Schubert T9292)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Schubert)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Spark)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Surround)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; T7575)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; T8697)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; T8788)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; T9295)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; T9296)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; TITAN X310e)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Titan)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Torphy T8686)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; X310e)","mobile":true,"tablet":false},{"vendor":"HTC","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC_blocked; T8788)","mobile":true,"tablet":false,"version":{"IE":"9.0","Windows Phone OS":"7.5","Trident":"5.0"},"model":"T8788"},{"vendor":"Hudl","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; Hudl HT7S3 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Huwaei","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.1-update1; bg-bg; Ideos S7 Build\/ERE27) AppleWebKit\/525.10+ (KHTML, like Gecko) Version\/3.0.4 Mobile Safari\/523.12.2","mobile":true,"tablet":true},{"vendor":"Huwaei","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.1; en-us; Ideos S7 Build\/ERE27) AppleWebKit\/525.10+ (KHTML, like Gecko) Version\/3.0.4 Mobile Safari\/523.12.2","mobile":true,"tablet":true},{"vendor":"Huwaei","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; lt-lt; U8660 Build\/HuaweiU8660) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Huwaei","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.7; ru-ru; HUAWEI-U8850 Build\/HuaweiU8850) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Huwaei","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.2; pl-pl; MediaPad Build\/HuaweiMediaPad) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13","mobile":true,"tablet":true},{"vendor":"Huwaei","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.2; nl-nl; HUAWEI MediaPad Build\/HuaweiMediaPad) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13","mobile":true,"tablet":true},{"vendor":"Huwaei","user_agent":"HUAWEI_T8951_TD\/1.0 Android\/4.0.4 (Linux; U; Android 4.0.4; zh-cn) Release\/05.31.2012 Browser\/WAP2.0 (AppleWebKit\/534.30) Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Huwaei","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; ar-eg; MediaPad 7 Youth Build\/HuaweiMediaPad) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Huwaei","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; zh-cn; HW-HUAWEI_C8815\/C8815V100R001C541B135; 540*960; CTC\/2.0) AppleWebKit\/534.30 (KHTML, like Gecko) Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Huwaei","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-cn; HW-HUAWEI_C8813D\/C8813DV100R001C92B172; 480*854; CTC\/2.0) AppleWebKit\/534.30 (KHTML, like Gecko) Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Huwaei","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-cn; HW-HUAWEI_Y300C\/Y300CV100R001C92B168; 480*800; CTC\/2.0) AppleWebKit\/534.30 (KHTML, like Gecko) Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Iconbit","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; NT-3702M Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Safari\/537.36 OPR\/16.0.1212.65583","mobile":true,"tablet":true},{"vendor":"Iconbit","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; NetTAB SPACE II Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"iJoy","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; fr-fr; Tablet Planet II-v3 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Intenso","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1.;de-de; INM8002KP Build\/JR003H) AppleWebKit\/534.30 (KHTML, like Gecko)Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.1.1.","Webkit":"534.30","Safari":"4.0"}},{"vendor":"IRU","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; M702pro Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"JXD","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; F3000 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Karbonn","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; ST10 Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"Kobo","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.0; en-us;) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 (Kobo Touch)","mobile":true,"tablet":true,"version":{"Android":"2.0","Webkit":"533.1","Safari":"4.0"}},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; es-es; IdeaTab_A1107 Build\/MR1) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.3; IdeaTab A2107A-H Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-au; ThinkPad Tablet Build\/ThinkPadTablet_A400_03) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"UCWEB\/2.0 (Linux; U; Opera Mini\/7.1.32052\/30.3697; en-US; IdeaTabA1000-G) U2\/1.0.0 UCBrowser\/9.2.0.419 Mobile","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; IdeaTabA1000-F Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.1; Lenovo A3000-H Build\/JOP40D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.117 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; IdeaTab A3000-F Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.360","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1; zh-cn; Lenovo-A3000-H\/S100) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.1 Mobile Safari\/534.300","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; es-us; IdeaTab A3000-F Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.3; IdeaTab A2107A-H Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; IdeaTab A2107A-H Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; es-es; IdeaTabA2109A Build\/JRO03R) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; nl-nl; IdeaTabA2109A Build\/JRO03R) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; es-es; IdeaTab_A1107 Build\/MR1) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.300","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; IdeaTab S6000-H Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; IdeaTab S6000-F Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; Lenovo B8000-F Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2;it-it; Lenovo B8000-F\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2.2 Mobile Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; it-it; Lenovo B6000-F\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2.2 Mobile Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Lenovo","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; Lenovo B6000-F Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2; en-us; LG-P509 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 MMS\/LG-Android-MMS-V1.0\/1.2","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2.2; pt-br; LG-P350f Build\/FRG83G) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 MMS\/LG-Android-MMS-V1.0\/1.2","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us; LG-P500 Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 MMS\/LG-Android-MMS-V1.0\/1.2","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us; LS670 Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.4; ru-ru; LG-E510 Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 MMS\/LG-Android-MMS-V1.0\/1.2","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.4; en-us; VS910 4G Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; nl-nl; LG-P700 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build\/IML74K) AppleWebkit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; LG-F160S Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; nl-nl; LG-E610v\/V10f Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; LG-E612 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; LG-F180K Build\/JZO54K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; LG-V500 Build\/JDQ39B) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; LG-LW770 Build\/IMM76I) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; Android 4.4.2; LG-V510 Build\/KOT49H.L004) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"LG","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG E-900)","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-C900)","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-C900k)","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-E900)","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-E900; Orange)","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-E900h)","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-Optimus 7)","mobile":true,"tablet":false},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.0.1; ja-jp; L-06C Build\/HRI66) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13","mobile":true,"tablet":true},{"vendor":"LG","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.0; en-us; LG-V900 Build\/HRI39) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13","mobile":true,"tablet":true},{"vendor":"Megafon","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.5; ru-ru; MegaFon V9 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"Megafon","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; MT7A Build\/JRO03C) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Safari\/537.31","mobile":true,"tablet":true},{"vendor":"MediaTek","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; fr-fr; MT8377 Build\/JRO03C) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30\/4.05d.1002.m7","mobile":true,"tablet":true},{"vendor":"Micromax","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; Micromax A110 Build\/JRO03C) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.169 Mobile Safari\/537.22","mobile":true,"tablet":false,"version":{"Android":"4.1.1","Build":"JRO03C","Webkit":"537.22","Chrome":"25.0.1364.169"}},{"vendor":"Micromax","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0; xx-xx; Micromax P250(Funbook) Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Webkit":"534.30","Android":"4.0","Build":"IMM76D","Safari":"4.0"}},{"vendor":"Microsoft","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0; Touch; .NET4.0E; .NET4.0C; Tablet PC 2.0)","mobile":true,"tablet":true,"version":{"IE":"10.0","Windows NT":"6.2","Trident":"6.0"}},{"vendor":"Microsoft","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0)","mobile":true,"tablet":true},{"vendor":"Microsoft","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0; Touch)","mobile":true,"tablet":true},{"vendor":"Microsoft","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0; Touch; ARMBJS)","mobile":true,"tablet":true},{"vendor":"Microsoft","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident\/6.0; Touch; MASMJS)","mobile":false,"tablet":false},{"vendor":"Microsoft","user_agent":"Mozilla\/5.0 (Windows NT 6.2; WOW64; rv:25.0) Gecko\/20130626 Firefox\/25.0","mobile":false,"tablet":false},{"vendor":"Microsoft","user_agent":"Mozilla\/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko\/20100101 Firefox\/22.0","mobile":false,"tablet":false},{"vendor":"Microsoft","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident\/6.0; MDDCJS)","mobile":false,"tablet":false},{"vendor":"Microsoft","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident\/6.0; MDDCJS)","mobile":false,"tablet":false},{"vendor":"Microsoft","user_agent":"Mozilla\/5.0 (Windows NT 6.2; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.52 Safari\/537.36 OPR\/15.0.1147.130","mobile":false,"tablet":false},{"vendor":"Microsoft","user_agent":"Mozilla\/5.0 (Windows NT 6.2; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.116 Safari\/537.36","mobile":false,"tablet":false},{"vendor":"Microsoft","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident\/6.0; Touch; MDDCJS; WebView\/1.0)","mobile":false,"tablet":false},{"vendor":"Modecom","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; pl-pl; FreeTAB 1014 IPS X4+ Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Motorola","user_agent":"MOT-W510\/08.11.05R MIB\/BER2.2 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 EGE\/1.0 UP.Link\/6.3.0.0.0","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2.2; zh-cn; ME722 Build\/MLS2GC_2.6.0) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.4; en-us; DROIDX Build\/4.5.1_57_DX8-51) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.5; en-us; MB855 Build\/4.5.1A-1_SUN-254_13) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.5; es-us; MB526 Build\/4.5.2-51_DFL-50) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; en-ca; MB860 Build\/4.5.2A-51_OLL-17.8) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.7; en-us; MOT-XT535 Build\/V1.540) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.7; ko-kr; A853 Build\/SHOLS_U2_05.26.3; CyanogenMod-7.1.2) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.0; en-us; Xoom Build\/HRI39) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13","mobile":true,"tablet":true},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.1; en-us; Xoom Build\/HMJ25) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13","mobile":true,"tablet":true},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; DROID RAZR 4G Build\/6.7.2-180_DHD-16_M4-31) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; Xoom Build\/IMM76L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; pt-br; XT687 Build\/V2.27D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false,"version":{"Android":"4.0.4","Webkit":"534.30","Safari":"4.0"},"model":"XT687"},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; es-es; MOT-XT910 Build\/6.7.2-180_SPU-19-TA-11.6) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; XT910 Build\/9.8.2O-124_SPUL-17) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; XT915 Build\/2_32A_2031) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; XT919 Build\/2_290_2017) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.64 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; XT925 Build\/9.8.2Q-50-XT925_VQLM-20) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; XT907 Build\/9.8.1Q-66) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; XT901 Build\/9.8.2Q-50_SLS-13) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"Motorola","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; DROID BIONIC Build\/9.8.2O-72_VZW-22) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Nabi","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2.1; en-us; NABI-A Build\/MASTER) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"NEC","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; ja-jp; N-08D Build\/A5001911) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"NEC","user_agent":"Mozilla\/5.0 (Linux; U; Android AAA; BBB; N-06D Build\/CCC) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"Nook","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2.1; en-us; NOOK BNRV200 Build\/ERD79 1.4.3) Apple WebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true,"version":{"Android":"2.2.1","Webkit":"533.1","Safari":"4.0"}},{"vendor":"Nook","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; NOOK BNTV400 Build\/ICS) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.0.4","Build":"ICS","Webkit":"534.30","Safari":"4.0"}},{"vendor":"Nook","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.4; BNTV600 Build\/IMM76L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36 Hughes-PFB\/CID5391275.AID1376709964","mobile":true,"tablet":true,"version":{"Android":"4.0.4","Build":"IMM76L","Webkit":"537.36","Chrome":"28.0.1500.94"}},{"vendor":"Nokia","user_agent":"Nokia200\/2.0 (12.04) Profile\/MIDP-2.1 Configuration\/CLDC-1.1 UCWEB\/2.0 (Java; U; MIDP-2.0; en-US; nokia200) U2\/1.0.0 UCBrowser\/8.9.0.251 U2\/1.0.0 Mobile UNTRUSTED\/1.0","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Nokia6303iclassic\/5.0 (06.61) Profile\/MIDP-2.1 Configuration\/CLDC-1.1 Mozilla\/5.0 AppleWebKit\/420+ (KHTML, like Gecko) Safari\/420+","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"nokian73-1\/UC Browser7.8.0.95\/69\/400 UNTRUSTED\/1.0","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Nokia2760\/2.0 (06.82) Profile\/MIDP-2.1 Configuration\/CLDC-1.1","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Nokia3650\/1.0 SymbianOS\/6.1 Series60\/1.2 Profile\/MIDP-1.0 Configuration\/CLDC-1.0","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"NokiaN70-1\/5.0737.3.0.1 Series60\/2.8 Profile\/MIDP-2.0 Configuration\/CLDC-1.1\/UC Browser7.8.0.95\/27\/352","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (S60V3; U; ru; NokiaN73) AppleWebKit\/530.13 (KHTML, like Gecko) UCBrowser\/8.6.0.199\/28\/444\/UCWEB Mobile","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (S60V3; U; ru; NokiaC5-00.2)\/UC Browser8.5.0.183\/28\/444\/UCWEB Mobile","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (S60V3; U; ru; NokiaC5-00.2) AppleWebKit\/530.13 (KHTML, like Gecko) UCBrowser\/8.7.0.218\/28\/352\/UCWEB Mobile","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (Series40; NokiaC3-00\/08.63; Profile\/MIDP-2.1 Configuration\/CLDC-1.1) Gecko\/20100401 S40OviBrowser\/2.2.0.0.33","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Opera\/9.80 (Series 60; Opera Mini\/7.0.31380\/28.2725; U; es) Presto\/2.8.119 Version\/11.10","mobile":true,"tablet":false,"version":{"Opera Mini":"7.0.31380","Presto":"2.8.119"}},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (Symbian\/3; Series60\/5.2 NokiaC7-00\/025.007; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.37 Mobile Safari\/533.4 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (Symbian\/3; Series60\/5.2 NokiaX7-00\/022.014; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.37 Mobile Safari\/533.4 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (Symbian\/3; Series60\/5.3 NokiaE6-00\/111.140.0058; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/535.1 (KHTML, like Gecko) NokiaBrowser\/8.3.1.4 Mobile Safari\/535.1 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (Symbian\/3; Series60\/5.3 NokiaC6-01\/111.040.1511; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/535.1 (KHTML, like Gecko) NokiaBrowser\/8.3.1.4 Mobile Safari\/535.1","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (Symbian\/3; Series60\/5.3 NokiaC6-01; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.4.2.6 Mobile Safari\/533.4 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (Symbian\/3; Series60\/5.3 Nokia700\/111.030.0609; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.4.2.6 Mobile Safari\/533.4 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (Symbian\/3; Series60\/5.3 Nokia700\/111.020.0308; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.4.1.14 Mobile Safari\/533.4 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (Symbian\/3; Series60\/5.3 NokiaN8-00\/111.040.1511; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/535.1 (KHTML, like Gecko) NokiaBrowser\/8.3.1.4 Mobile Safari\/535.1 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (Symbian\/3; Series60\/5.3 Nokia701\/111.030.0609; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.4.2.6 Mobile Safari\/533.4 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 Nokia6120c\/3.83; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 Nokia6120ci\/7.02; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 Nokia6120c\/7.10; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaE66-1\/510.21.009; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaE71-1\/110.07.127; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaN95-3\/20.2.011 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaE51-1\/200.34.36; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaE63-1\/500.21.009; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaN82\/10.0.046; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaE52-1\/052.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.6.2","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaE52-1\/@version@; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.26 Mobile Safari\/533.4 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaC5-00\/031.022; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.3.1","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaC5-00.2\/081.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.32 Mobile Safari\/533.4 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.3; U; Series60\/3.2 NokiaN79-1\/32.001; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.3; U; Series60\/3.2 Nokia6220c-1\/06.101; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaC5-00.2\/071.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.26 Mobile Safari\/533.4 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaE72-1\/081.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.32 Mobile Safari\/533.4 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaC5-00\/061.005; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.6.2 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 NokiaX6-00\/40.0.002; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.33 Mobile Safari\/533.4 3gpp-gb","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 Nokia5800d-1\/60.0.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.33 Mobile Safari\/533.4 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 NokiaC5-03\/12.0.023; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.6.9 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 Nokia5228\/40.1.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.7.4 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 Nokia5230\/51.0.002; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.33 Mobile Safari\/533.4 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 Nokia5530c-2\/32.0.007; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.6.9 3gpp-gba","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 NokiaN97-1\/21.0.045; Profile\/MIDP-2.1 Configuration\/CLDC-1.1) AppleWebKit\/525 (KHTML, like Gecko) BrowserNG\/7.1.4","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 NokiaN97-4\/30.0.004; Profile\/MIDP-2.1 Configuration\/CLDC-1.1) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.28 3gpp-gba","mobile":true,"tablet":false,"version":{"Symbian":"9.4","Webkit":"533.4","NokiaBrowser":"7.3.1.28"},"model":"NokiaN97-4"},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; 7 Mozart T8698)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; 710)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; 800)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; 800C)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; 800C; Orange)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; 900)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; HD7 T9292)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; LG E-900)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 610)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 710)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 710; Orange)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 710; T-Mobile)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 710; Vodafone)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800) UP.Link\/5.1.2.6","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800; Orange)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800; SFR)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800; T-Mobile)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800; vodafone)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; Lumia 800c)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 900)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; Lumia 920)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident\/6.0; IEMobile\/10.0; ARM; Touch; NOKIA; Lumia 920)","mobile":true,"tablet":false,"version":{"IE":"10.0","Windows Phone OS":"8.0","Trident":"6.0"},"model":"Lumia 920"},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; lumia800)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Nokia 610)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Nokia 710)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Nokia 800)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Nokia 800C)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Nokia 900)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; Nokia)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; SGH-i917)","mobile":true,"tablet":false},{"vendor":"Nokia","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; TITAN X310e)","mobile":true,"tablet":false,"version":{"Windows Phone OS":"7.5","Trident":"5.0"},"model":"TITAN X310e"},{"vendor":"Odys","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; LOOX Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Odys","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; LOOX Plus Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Odys","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.X; de-de; XENO10 Build\/ODYS XENO 10) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Odys","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2.2; de-de; ODYS Space Build\/I700T_P7_T04_TSCL_FT_R_0_03_1010_110623) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"OverMax","user_agent":"OV-SteelCore(B) Mozilla\/5.0 (iPad; CPU OS 5_0_1 like Mac OS X) AppleWebKit\/534.46 (KHTML, like Gecko) Version\/5.1 Mobile\/9A405 Safari\/7534.48.3","mobile":true,"tablet":true},{"vendor":"OverMax","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; pl-pl; OV-SteelCore Build\/ICS.g08refem611.20121010) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"YONESTablet","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; pl-pl; BC1077 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Pantech","user_agent":"PANTECH-C790\/JAUS08312009 Browser\/Obigo\/Q05A Profile\/MIDP-2.0 Configuration\/CLDC-1.1","mobile":true,"tablet":false},{"vendor":"Pantech","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2.1; ko-kr; SKY IM-A600S Build\/FRG83) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Pantech","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us; ADR8995 4G Build\/GRI40) AppleWebKit\/533.1 (KHTML like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Pantech","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.2.1; en-us; PantechP4100 Build\/HTK75) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13","mobile":true,"tablet":true},{"vendor":"Philips","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; W732 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"PointOfView","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; POV_TAB-PROTAB30-IPS10 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Prestigio","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; PMP5297C_QUAD Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Prestigio","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; sk-sk; PMP7100D3G Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.0.4","Build":"IMM76D","Webkit":"534.30","Safari":"4.0"},"model":"PMP7100D3G"},{"vendor":"Prestigio","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; sk-sk; PMP7280C3G Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 MobilSafari\/534.30","mobile":true,"tablet":true},{"vendor":"PROSCAN","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; PLT8088 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.1.1","Build":"JRO03H","Webkit":"534.30","Safari":"4.0"}},{"vendor":"PyleAudio","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.4; PTBL92BC Build\/IMM76D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36","mobile":true,"tablet":true,"version":{"Android":"4.0.4","Build":"IMM76D","Webkit":"537.36","Chrome":"31.0.1650.59"}},{"vendor":"RockChip","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2.1; hu-hu; RK2818, Build\/MASTER) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"RockChip","user_agent":"Mozilla\/5.0 (Linux; U; Android Android 2.1-RK2818-1.0.0; zh-cn; MD701 Build\/ECLAIR) AppleWebKit\/530.17 (KHTML like Gecko) Version\/4.0 Mobile Safari\/530.17","mobile":true,"tablet":true},{"vendor":"RossMoor","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.1; ru-ru; RM-790 Build\/JOP40D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"QMobile","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; A2 Build\/GRK39F) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"MQQBrowser\/4.0\/Mozilla\/5.0 (Linux; U; Android 3.2; zh-cn; GT-P6800 Build\/HTJ85B) AppleWebKit\/533.1 (KHTML, like Gecko) Mobile Safari\/533.1","mobile":true,"tablet":true,"version":{"MQQBrowser":"4.0"}},{"vendor":"Samsung","user_agent":"SAMSUNG-SGH-P250-ORANGE\/P250BVHH8 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 UP.Browser\/6.2.3.3.c.1.101 (GUI) MMP\/2.0","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"SAMSUNG-GT-B2710\/B271MCXKF1 SHP\/VPP\/R5 Dolfin\/2.0 QTV\/5.3 SMM-MMS\/1.2.0 profile\/MIDP-2.1 configuration\/CLDC-1.1 OPN-B","mobile":true,"tablet":false,"version":{"Dolfin":"2.0"}},{"vendor":"Samsung","user_agent":"SAMSUNG-SGH-D900i\/1.0 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 UP.Browser\/6.2.3.3.c.1.101 (GUI) MMP\/2.0","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"SAMSUNG-GT-S5233T\/S5233TXEJE3 SHP\/VPP\/R5 Jasmine\/0.8 Qtv5.3 SMM-MMS\/1.2.0 profile\/MIDP-2.1 configuration\/CLDC-1.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (SAMSUNG; SAMSUNG-GT-S5380D\/S5380FXXKL3; U; Bada\/2.0; ru-ru) AppleWebKit\/534.20 (KHTML, like Gecko) Dolfin\/3.0 Mobile HVGA SMM-MMS\/1.2.0 OPN-B","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"SAMSUNG-GT-C3312\/1.0 NetFront\/4.2 Profile\/MIDP-2.0 Configuration\/CLDC-1.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 1.5; de-de; Galaxy Build\/CUPCAKE) AppleWebKit\/528.5 (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/525.20.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"SAMSUNG-GT-S3650\/S3650XEII3 SHP\/VPP\/R5 Jasmine\/1.0 Nextreaming SMM-MMS\/1.2.0 profile\/MIDP-2.1 configuration\/CLDC-1.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"JUC (Linux; U; 2.3.6; zh-cn; GT-S5360; 240*320) UCWEB7.9.0.94\/140\/352","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (SAMSUNG; SAMSUNG-GT-S5250\/S5250XEKJ3; U; Bada\/1.0; ru-ru) AppleWebKit\/533.1 (KHTML, like Gecko) Dolfin\/2.0 Mobile WQVGA SMM-MMS\/1.2.0 NexPlayer\/3.0 profile\/MIDP-2.1 configuration\/CLDC-1.1 OPN-B","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident\/3.1; IEMobile\/7.0; SAMSUNG; SGH-i917)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (SAMSUNG; SAMSUNG-GT-S8530\/S8530XXJKA; U; Bada\/1.2; cs-cz) AppleWebKit\/533.1 (KHTML, like Gecko) Dolfin\/2.2 Mobile WVGA SMM-MMS\/1.2.0 OPN-B","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 1.6; ru-ru; Galaxy Build\/Donut) AppleWebKit\/528.5+ (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/525.20.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.1-update1; ru-ru; GT-I5500 Build\/ERE27) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2; en-us; GALAXY_Tab Build\/MASTER) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2; ja-jp; SC-01C Build\/FROYO) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2; fr-fr; GT-I9000 Build\/FROYO) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2.1; zh-cn; SCH-i909 Build\/FROYO) UC AppleWebKit\/534.31 (KHTML, like Gecko) Mobile Safari\/534.31","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.3; ja-jp; SC-01C Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.3; en-gb; GT-P1000 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.3; el-gr; GT-I9001 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.3; en-ca; SGH-I896 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.4; es-us; GT-S5660L Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 MicroMessenger\/4.5.1.261","mobile":true,"tablet":false,"version":{"MicroMessenger":"4.5.1.261"}},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; GT-S5660 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-S6102 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; pt-br; GT-S5367 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; fr-fr; GT-S5839i Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S7500 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S5830 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; es-us; GT-B5510L Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; pl-pl; GT-I9001-ORANGE\/I9001BVKPC Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; GT-I8150 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; nl-nl; GT-I9070 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S5360 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; es-us; GT-S6102B Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; GT-S5830i Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-I8160 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-S6802 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.7; ru-ru; GT-S5830 Build\/GRWK74; LeWa_ROM_Cooper_12.09.21) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-N7000 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.0.1; en-us; GT-P7100 Build\/HRI83) AppleWebkit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.2; he-il; GT-P7300 Build\/HTJ85B) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.2; en-gb; GT-P6200 Build\/HTJ85B) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-gb; GT-I9100 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; GT-I9100G Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; nl-nl; GT-P5100 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android-4.0.3; en-us; Galaxy Nexus Build\/IML74K) AppleWebKit\/535.7 (KHTML, like Gecko) CrMo\/16.0.912.75 Mobile Safari\/535.7","mobile":true,"tablet":false,"version":{"Chrome":"16.0.912.75"}},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.3; SGH-T989 Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false,"version":{"Chrome":"18.0.1025.166"}},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P5100 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.4; GT-I9300 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.4; SPH-D710 Build\/IMM76I) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; zh-cn; GT-I9300 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300-ORANGE\/I9300BVBLG2 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; th-th; GT-I9300T Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-I9100 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us ; GT-I9100 Build\/IMM76D) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1\/UCBrowser\/8.4.1.204\/145\/355","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; GT-N7000 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; th-th; GT-P6800 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.4; SAMSUNG-SGH-I747 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; es-es; GT-P5110 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.4; GT-P5110 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; zh-cn; SAMSUNG-GT-S7568_TD\/1.0 Android\/4.0.4 Release\/07.15.2012 Browser\/AppleWebKit534.30 Build\/IMM76D) ApplelWebkit\/534.30 (KHTML,like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false,"version":{"Android":"4.0.4"}},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P3100 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; tr-tr; GT-P3105 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-ca; GT-N8010 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-S7562 Build\/IMM76I) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; GT-N7100 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; GT-N7100 Build\/JZO54K) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.123 Mobile Safari\/537.22 OPR\/14.0.1025.52315","mobile":true,"tablet":false,"version":{"Build":"JZO54K","Webkit":"537.22","Opera":"14.0.1025.52315"}},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-hk; GT-N7105 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; GT-N8000 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; SGH-i747M Build\/JRO03L) AppleWebKit\/535.19(KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; Galaxy Nexus - 4.1.1 - with Google Apps - API 16 - 720x1280 Build\/JRO03S) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; GT-I8262 Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; it-it; Galaxy Nexus Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; SGH-I777 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; GT-S7710 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; GT-I9082 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; SGH-T999L Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; GT-P5210 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, Like Gecko) Chrome\/27.0.1453.90 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; en-us; SAMSUNG GT-I9200 Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Version\/1.0 Chrome\/18.0.1025.308 Mobile Safari\/535.19","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; zh-cn; SCH-I959 Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Version\/1.0 Chrome\/18.0.1025.308 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; nl-nl; SM-T310 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; Android 4.3; en-us; SAMSUNG SM-P600 Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/1.5 Chrome\/28.0.1500.94 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; GT-N5100 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (Linux; Android 4.4.2; en-us; SAMSUNG SM-T530NU Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/1.5 Chrome\/28.0.1500.94 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; CETUS)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; Focus I917 By TC)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; Focus i917)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; FOCUS S)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; GT-I8350)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; GT-i8700)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; GT-S7530)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; Hljchm's Wp)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; I917)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; OMNIA 7)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; OMNIA7 By MWP_HS)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; OMNIA7)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; OMNIA7; Orange)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i677)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i917)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i917.)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i917R)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i937)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SMG-917R)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG_blocked_blocked_blocked; OMNIA7; Orange)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG_blocked_blocked_blocked_blocked; OMNIA7; Orange)","mobile":true,"tablet":false},{"vendor":"Samsung","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SUMSUNG; OMNIA 7)","mobile":true,"tablet":false},{"vendor":"simvalley","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.4; de-de; SP-80 Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"SonyEricssonK800i\/R1AA Browser\/NetFront\/3.3 Profile\/MIDP-2.0 Configuration\/CLDC-1.1","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.1-update1; es-ar; SonyEricssonE15a Build\/2.0.1.A.0.47) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.1-update1; pt-br; SonyEricssonU20a Build\/2.1.1.A.0.6) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.3; en-au; SonyEricssonX10i Build\/3.0.1.G.0.75) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.4; ru-ru; SonyEricssonST18i Build\/4.0.2.A.0.62) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.4; hr-hr; SonyEricssonST15i Build\/4.0.2.A.0.62) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.4; sk-sk; SonyEricssonLT15i Build\/4.0.2.A.0.62) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.7; th-th; SonyEricssonST27i Build\/6.0.B.3.184) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.7; de-de; SonyEricssonST25i Build\/6.0.B.3.184) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; pt-br; Xperia Tablet S Build\/TID0092) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.0.3","Build":"TID0092","Webkit":"534.30","Safari":"4.0"}},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.3; LT18i Build\/4.1.A.0.562) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.3; Sony Tablet S Build\/TISU0R0110) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; es-es; Sony Tablet S Build\/TISU0143) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; SonyEricssonLT18i Build\/4.1.B.0.587) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; fr-ch; SonyEricssonSK17i Build\/4.1.B.0.587) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; SonyEricssonLT26i Build\/6.1.A.2.45) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.4; LT22i Build\/6.1.B.0.544) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; vi-vn; SonyEricssonLT22i Build\/6.1.B.0.544) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.4; ST23i Build\/11.0.A.5.5) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.4; ST23i Build\/11.0.A.2.10) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.4; LT28h Build\/6.1.E.3.7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; SGPT13 Build\/TJDS0170) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; ja-jp; SonySO-03E Build\/10.1.E.0.265) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.1.2","Build":"10.1.E.0.265","Webkit":"534.30","Safari":"4.0"}},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; LT26w Build\/6.2.B.1.96) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; SGP321 Build\/10.3.1.A.0.33) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Safari\/537.31","mobile":true,"tablet":true,"version":{"Android":"4.2.2","Build":"10.3.1.A.0.33","Webkit":"537.31","Chrome":"26.0.1410.58"}},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; XL39h Build\/14.2.A.1.136) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; sv-se; C5503 Build\/10.1.1.A.1.273) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; C5502 Build\/10.1.1.A.1.310) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-cn; SonyL39t Build\/14.1.M.0.202) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-cn; L39u Build\/14.1.n.0.63) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; zh-tw; M35c Build\/12.0.B.5.37) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; M35c Build\/12.0.B.2.42) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; zh-CN; M35t Build\/12.0.C.2.42) AppleWebKit\/534.31 (KHTML, like Gecko) UCBrowser\/9.3.2.349 U3\/0.8.0 Mobile Safari\/534.31","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.4.2; D6502 Build\/17.1.A.2.69) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.4.2; D6503 Build\/17.1.A.0.504) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.4.2; D6543 Build\/17.1.A.2.55) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.3; D2004 Build\/20.0.A.0.29) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.3; en-gb; D2005 Build\/20.0.A.1.12) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.3; D2104 Build\/20.0.B.0.84) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.3; D2105 Build\/20.0.B.0.74) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.170 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.3; pt-br; D2114 Build\/20.0.B.0.85) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.3; D2302 Build\/18.0.B.1.23) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; S50h Build\/18.0.b.1.23) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.6.3.413 U3\/0.8.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.3; D2303 Build\/18.0.C.1.13) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.3; D2305 Build\/18.0.A.1.30) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.3; D2306 Build\/18.0.C.1.7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.3; D5303 Build\/19.0.1.A.0.207) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.4.2; D5306 Build\/19.1.A.0.264) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.3; zh-CN; XM50h Build\/19.0.D.0.269) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.7.6.428 U3\/0.8.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; XM50t Build\/19.0.C.2.59) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.3; D5322 Build\/19.0.D.0.253) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.131","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; M51w Build\/14.2.A.1.146) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.3; M51w Build\/14.2.A.1.146) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.4.1; D5102 Build\/18.2.A.0.9) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.4.1; D5103 Build\/18.1.A.0.11) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.4.1; D5106 Build\/18.1.A.0.11) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.3; en-gb; C6902 Build\/14.2.A.1.136) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 GSA\/3.2.17.1009776.arm","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; es-es; C6943 Build\/14.1.G.2.257) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.4.2; C6943 Build\/14.3.A.0.681) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; SGP412 Build\/14.1.B.3.320) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1; en-us; SonySGP321 Build\/10.2.C.0.143) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.2; SGP351 Build\/10.1.1.A.1.307) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.3; SGP341 Build\/10.4.B.0.569) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.4.2; SGP511 Build\/17.1.A.2.36) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.4.2; SGP512 Build\/17.1.A.2.36) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; fr-ch; SGP311 Build\/10.1.C.0.344) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; SGP312 Build\/10.1.C.0.344) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.4.2; de-de; SGP521 Build\/17.1.A.2.69) AppleWebKit\/537.16 (KHTML, like Gecko) Version\/4.0 Safari\/537.16","mobile":true,"tablet":true},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.4.2; zh-cn; SGP541 Build\/17.1.A.2.36) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Sony","user_agent":"Mozilla\/5.0 (Linux; Android 4.4.2; SGP551 Build\/17.1.A.2.72) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Sony","user_agent":"SonyEricssonU5i\/R2CA; Mozilla\/5.0 (SymbianOS\/9.4; U; Series60\/5.0 Profile\/MIDP-2.1 Configuration\/CLDC-1.1) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 Safari\/525","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"SonyEricssonU5i\/R2AA; Mozilla\/5.0 (SymbianOS\/9.4; U; Series60\/5.0 Profile\/MIDP-2.1 Configuration\/CLDC-1.1) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 Safari\/525","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Mozilla\/4.0 (PDA; PalmOS\/sony\/model prmr\/Revision:1.1.54 (en)) NetFront\/3.0","mobile":true,"tablet":false},{"vendor":"Sony","user_agent":"Opera\/9.80 (Linux mips; U; InettvBrowser\/2.2 (00014A;SonyDTV115;0002;0100) KDL40EX720; CC\/BEL; en) Presto\/2.7.61 Version\/11.00","mobile":false,"tablet":false},{"vendor":"Sony","user_agent":"Opera\/9.80 (Linux armv7l; HbbTV\/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto\/2.12.362 Version\/12.11","mobile":false,"tablet":false},{"vendor":"Skk","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1; en-us; CYCLOPS Build\/F10) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Storex","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; eZee_Tab903 Build\/JRO03H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.36","mobile":true,"tablet":true,"version":{"Android":"4.1.1","Build":"JRO03H","Webkit":"537.36"}},{"vendor":"Storex","user_agent":"Mozilla\/5.0 (Linux; Android 4.1.1; eZee'Tab785 Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Safari\/537.36","mobile":true,"tablet":true,"version":{"Android":"4.1.1","Build":"JRO03C","Webkit":"537.36"}},{"vendor":"Storex","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.3; eZee'Tab971 Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true,"version":{"Android":"4.0.3","Build":"IML74K","Webkit":"535.19"}},{"vendor":"Tecno","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; TECNO P9 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Telstra","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.7; en-au; T-Hub2 Build\/TVA301TELBG3) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"texet","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.4; ru-ru; TM-7021 Build\/GB.m1ref.20120116) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true,"version":{"Android":"2.3.4","Webkit":"533.1","Safari":"4.0"},"model":"TM-7021"},{"vendor":"Tolino","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 7 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.2.2","Build":"JDQ39","Webkit":"534.30","Safari":"4.0"}},{"vendor":"Tolino","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 8.9 Build\/JDQ39) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.2.2","Build":"JDQ39","Webkit":"534.30","Safari":"4.0"}},{"vendor":"Tolino","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; tolino tab 7 Build\/JDQ39) AppleWebkit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.57 Safari\/537.36 OPR\/18.0.1290.67495","mobile":true,"tablet":true},{"vendor":"Tolino","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 7 Build\/JDQ39) AppleWebkit\/537.36 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Toshiba","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; TOSHIBA; TSUNAGI)","mobile":true,"tablet":false},{"vendor":"Toshiba","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2; it-it; TOSHIBA_FOLIO_AND_A Build\/TOSHIBA_FOLIO_AND_A) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true,"version":{"Android":"2.2","Webkit":"533.1","Safari":"4.0"}},{"vendor":"Trekstor","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; ST70408-1 Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Safari\/537.31","mobile":true,"tablet":true,"version":{"Android":"4.2.2","Build":"JDQ39","Webkit":"537.31","Chrome":"26.0.1410.58"}},{"vendor":"Trekstor","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; VT10416-2 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Trekstor","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ST10216-2A Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30;SurfTab_10.1","mobile":true,"tablet":true},{"vendor":"Visture","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; V97 HD Build\/LR-97JC) Apple WebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Visture","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; Visture V4 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Visture","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; Visture V4 HD Build\/Visture V4 HD) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Visture","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; es-es; Visture V5 HD Build\/Visture V5 HD) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Visture","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; Visture V10 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Versus","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.4; VS-TOUCHPAD 9 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":true},{"vendor":"Versus","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; Versus Touchpad 9.7 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Versus","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-gb; CnM-TOUCHPAD7 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30 BMID\/E67A45B1AB","mobile":true,"tablet":true},{"vendor":"Versus","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; CnM TouchPad 7DC Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30 TwonkyBeamBrowser\/3.3.5-95 (Android 4.1.1; rockchip CnM TouchPad 7DC Build\/meizhi_V2.80.wifi8723.20121225.b11c800)","mobile":true,"tablet":true},{"vendor":"Versus","user_agent":"OneBrowser\/3.5\/Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; TOUCHPAD 7 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Versus","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; TOUCHTAB Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true,"version":{"Android":"4.1.1","Build":"JRO03H","Webkit":"534.30","Safari":"4.0"}},{"vendor":"Viewsonic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; ViewPad 10e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Viewsonic","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2; it-it; ViewPad7 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"Viewsonic","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2.1; en-ca; ViewSonic VB733 Build\/FRG83) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"Viewsonic","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.2; en-gb; ViewPad7X Build\/HTJ85B) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Safari\/533.1","mobile":true,"tablet":true},{"vendor":"Viewsonic","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2; pt-br; ViewPad 10S Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":true},{"vendor":"Viewsonic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; VB100a Pro Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Vodafone","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.2; hu-hu; SmartTab10-MSM8260-V02d-Dec022011-Vodafone-HU) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0","mobile":true,"tablet":true},{"vendor":"Vodafone","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.3; SmartTabII10 Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19","mobile":true,"tablet":true},{"vendor":"Vodafone","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; fr-fr; SmartTAB 1002 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Vonino","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; Sirius_Evo_QS Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Vonino","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; Q8 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Xoro","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; PAD 9720QR Build\/PAD 9719QR) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Xoro","user_agent":"Mozilla\/5.0 (Linux; Android 4.2.2; PAD720 Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19","mobile":true,"tablet":true},{"vendor":"ZTE","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.1;zh-cn; ZTE V987 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30;","mobile":true,"tablet":false},{"vendor":"ZTE","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.5; pt-pt; Blade Build\/tejosunhsine) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1","mobile":true,"tablet":false},{"vendor":"ZTE","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; ZTE; N880e_Dawoer_Fulllock; China Telecom)","mobile":true,"tablet":false},{"vendor":"ZTE","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; ZTE; V965W)","mobile":true,"tablet":false},{"vendor":"ZTE","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; ZTE; Windows Phone - Internet 7; SFR)","mobile":true,"tablet":false},{"vendor":"Zync","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us ; Z909 Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1\/UCBrowser\/8.4.1.204\/145\/444","mobile":true,"tablet":true},{"vendor":"Console","user_agent":"Mozilla\/5.0 (Nintendo WiiU) AppleWebKit\/534.52 (KHTML, like Gecko) NX\/{Version No} NintendoBrowser\/{Version No}.US","mobile":false,"tablet":false},{"vendor":"Console","user_agent":"Mozilla\/5.0 (PLAYSTATION 3 4.21) AppleWebKit\/531.22.8 (KHTML, like Gecko)","mobile":false,"tablet":false},{"vendor":"Console","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident\/5.0; Xbox)","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (X11; Linux i686) AppleWebKit\/537.36 (KHTML, like Gecko) Ubuntu Chromium\/32.0.1700.102 Chrome\/32.0.1700.102 Safari\/537.36","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko\/20100101 Firefox\/24.0","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko\/20100101 Firefox\/18.0 AlexaToolbar\/psPCtGhf-2.2","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko\/20100101 Firefox\/22.0","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (X11; Linux ppc; rv:17.0) Gecko\/20130626 Firefox\/17.0 Iceweasel\/17.0.7","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (X11; Linux) AppleWebKit\/535.22+ Midori\/0.4","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (Macintosh; U; Intel Mac OS X; en-us) AppleWebKit\/535+ (KHTML, like Gecko) Version\/5.0 Safari\/535.20+ Midori\/0.4","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (Windows NT 6.2; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.20 Safari\/537.36 OPR\/15.0.1147.18 (Edition Next)","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (Windows NT 6.2) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.94 Safari\/537.36","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (Windows NT 5.2; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.94 Safari\/537.36","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (Windows NT 5.2; WOW64; rv:21.0) Gecko\/20100101 Firefox\/21.0","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Opera\/9.80 (Windows NT 5.2; WOW64) Presto\/2.12.388 Version\/12.14","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko\/20100101 Firefox\/19.0","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (X11; FreeBSD amd64; rv:14.0) Gecko\/20100101 Firefox\/14.0.1","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Win64; x64; Trident\/6.0; Touch; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Tablet PC 2.0; MASMJS)","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident\/6.0; MANMJS)","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident\/6.0; MASMJS)","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident\/6.0; Touch; MASMJS)","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Opera\/9.80 (Windows NT 6.2; WOW64; MRA 8.0 (build 5784)) Presto\/2.12.388 Version\/12.11","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident\/6.0)","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (Windows NT 6.3; Trident\/7.0; rv 11.0) like Gecko","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (Windows NT 6.3; WOW64; Trident\/7.0; Touch; rv:11.0) like Gecko","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Mozilla\/5.0 (Unknown; Linux armv7l) AppleWebKit\/537.1+ (KHTML, like Gecko) Safari\/537.1+ HbbTV\/1.1.1 ( ;LGE ;NetCast 4.0 ;03.20.30 ;1.0M ;)","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"HbbTV\/1.1.1 (;Panasonic;VIERA 2012;1.261;0071-3103 2000-0000;)","mobile":false,"tablet":false},{"vendor":"Other","user_agent":"Opera\/9.80 (Linux armv7l; HbbTV\/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto\/2.12.362 Version\/12.11","mobile":false,"tablet":false},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.3; ALUMIUM10 Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.36","mobile":true,"tablet":true},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.1; en-us; JY-G3 Build\/JOP40D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":false},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; hu-hu; M758A Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; EVOTAB Build\/IMM76I) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Generic","user_agent":"Java\/1.6.0_22","mobile":false,"tablet":false,"version":{"Java":"1.6.0_22"}},{"vendor":"Generic","user_agent":"Opera\/9.80 (Series 60; Opera Mini\/6.5.29260\/29.3417; U; ru) Presto\/2.8.119 Version\/11.10","mobile":true,"tablet":false},{"vendor":"Generic","user_agent":"Opera\/9.80 (Android; Opera Mini\/6.5.27452\/29.3417; U; ru) Presto\/2.8.119 Version\/11.10","mobile":true,"tablet":false},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/537.17 (KHTML, like Gecko) Chrome\/24.0.1312.60 Safari\/537.17 OPR\/14.0.1025.52315","mobile":false,"tablet":false},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (X11; CrOS armv7l 4920.83.0) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.103 Safari\/537.36"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit\/533.17.9 (KHTML, like Gecko) Version\/5.0.2 Mobile\/8H7 Safari\/6533.18.5"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; fr-fr; GT-I9070 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30"},{"vendor":"Generic","user_agent":"Opera\/9.80 (Android 2.3.7; Linux; Opera Mobi\/46154) Presto\/2.11.355 Version\/12.10"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; it-it; DATAM819HD_C Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; nl-nl; SGPT12 Build\/TID0142) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; cm_tenderloin Build\/IMM76L; CyanogenMod-9) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; fr-fr; A210 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (iPad; CPU OS 6_1 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Version\/6.0 Mobile\/10B141 Safari\/8536.25"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; en-gb; GT-I8150 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (iPad; CPU OS 6_0_1 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Mercury\/7.2 Mobile\/10A523 Safari\/8536.25"},{"vendor":"Generic","user_agent":"Opera\/9.80 (Android 2.3.7; Linux; Opera Tablet\/46154) Presto\/2.11.355 Version\/12.10"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; sdk Build\/MASTER) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2; en-us; sdk Build\/JB_MR1) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; GT-P7510 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30"},{"vendor":"Generic","user_agent":"Opera\/9.80 (X11; Linux zbov) Presto\/2.11.355 Version\/12.10"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; TOUCHPAD 7 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (iPhone; U; CPU OS 4_2_1 like Mac OS X) AppleWebKit\/532.9 (KHTML, like Gecko) Version\/5.0.3 Mobile\/8B5097d Safari\/6531.22.7"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-gb; SGPT12 Build\/TID0142) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Nintendo 3DS; U; ; en) Version\/1.7498.US"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.0.6_b1; ru-ru Build\/ECLAIR) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.4; z1000 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; Android 4.0.3; cm_tenderloin Build\/GWK74) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us; Android for Techvision TV1T808 Board Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1"},{"vendor":"Generic","user_agent":"BlackBerry8520\/5.0.0.592 Profile\/MIDP-2.1 Configuration\/CLDC-1.1 VendorID\/136"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Windows NT 6.2) AppleWebKit\/537.17 (KHTML, like Gecko) Chrome\/24.0.1312.56 Safari\/537.17"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.1; ru-ru; LG-V900 Build\/HMJ37) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident\/6.0; IEMobile\/10.0; ARM; Touch; HTC; Windows Phone 8S by HTC)"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0; Touch)"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (PLAYSTATION 3 4.11) AppleWebKit\/531.22.8 (KHTML, like Gecko)"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.2; ru-ru; V9S_V1.4) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0; Touch)"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.2; es-es; Broncho N701 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0; Touch)"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0; Touch; WebView\/1.0)"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; Next7P12 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30"},{"vendor":"Generic","user_agent":"Opera\/9.80 (X11; Linux zbov) Presto\/2.11.355 Version\/12.10"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0; Touch)"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 2.3.6; es-es; SAMSUNG GT-S5830\/S5830BUKT2 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 3.2.1; en-gb;HTC_Flyer_P512 Build\/HTK75C) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; full Android on Microsoft Windows, pad, pc, n*books Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30"},{"vendor":"Generic","user_agent":"Opera\/9.80 (Linux mips; U; InettvBrowser\/2.2 (00014A;SonyDTV115;0002;0100) KDL40EX720; CC\/BEL; en) Presto\/2.7.61 Version\/11.00"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Android; Mobile; rv:18.0) Gecko\/18.0 Firefox\/18.0"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Windows NT 6.1) AppleWebKit\/535.12 (KHTML, like Gecko) Maxthon\/3.0 Chrome\/18.0.966.0 Safari\/535.12"},{"vendor":"Generic","user_agent":"Opera\/9.80 (Windows NT 5.1; U; Edition Yx; ru) Presto\/2.10.289 Version\/12.02"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2; en-us; sdk Build\/JB_MR1) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30"},{"vendor":"Generic","user_agent":"Mozilla\/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Windows Phone 6.5.3.5)"},{"vendor":"Generic","user_agent":"PalmCentro\/v0001 Mozilla\/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource\/Palm-D061; Blazer\/4.5) 16;320x320"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0)"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Microsoft; XDeviceEmulator)"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; MAL; N880E; China Telecom)"},{"vendor":"Generic","user_agent":"Opera\/9.80 (Series 60; Opera Mini\/7.0.29482\/28.2859; U; ru) Presto\/2.8.119 Version\/11.10"},{"vendor":"Generic","user_agent":"Opera\/9.80 (S60; SymbOS; Opera Mobi\/SYB-1202242143; U; en-GB) Presto\/2.10.254 Version\/12.00"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.3; en-au; 97D Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30"},{"vendor":"Generic","user_agent":"Opera\/9.80 (Android; Opera Mini\/7.0.29952\/28.2647; U; ru) Presto\/2.8.119 Version\/11.10"},{"vendor":"Generic","user_agent":"Opera\/9.80 (Android; Opera Mini\/6.1.25375\/28.2555; U; en) Presto\/2.8.119 Version\/11.10"},{"vendor":"Generic","user_agent":"Opera\/9.80 (Mac OS X; Opera Tablet\/35779; U; en) Presto\/2.10.254 Version\/12.00"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Android; Tablet; rv:10.0.4) Gecko\/10.0.4 Firefox\/10.0.4 Fennec\/10.0.4"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Android; Tablet; rv:18.0) Gecko\/18.0 Firefox\/18.0"},{"vendor":"Generic","user_agent":"Opera\/9.80 (Linux armv7l; Maemo; Opera Mobi\/14; U; en) Presto\/2.9.201 Version\/11.50"},{"vendor":"Generic","user_agent":"Opera\/9.80 (Android 2.2.1; Linux; Opera Mobi\/ADR-1207201819; U; en) Presto\/2.10.254 Version\/12.00","mobile":true,"tablet":false},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; sdk Build\/JRO03E) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30"},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; Endeavour 1010 Build\/ONDA_MID) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Generic","user_agent":"Mozilla\/5.0 (Linux; U; Android 4.0.4; de-de; Tablet-PC-4 Build\/ICS.g08refem618.20121102) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30","mobile":true,"tablet":true},{"vendor":"Bot","user_agent":"Mozilla\/5.0 (compatible; Googlebot\/2.1; +http:\/\/www.google.com\/bot.html)","mobile":false,"tablet":false},{"vendor":"Bot","user_agent":"grub-client-1.5.3; (grub-client-1.5.3; Crawl your own stuff with http:\/\/grub.org)","mobile":false,"tablet":false},{"vendor":"Bot","user_agent":"Googlebot-Image\/1.0","mobile":false,"tablet":false},{"vendor":"Bot","user_agent":"Python-urllib\/2.5","mobile":false,"tablet":false},{"vendor":"Bot","user_agent":"facebookexternalhit\/1.0 (+http:\/\/www.facebook.com\/externalhit_uatext.php)","mobile":false,"tablet":false}]} \ No newline at end of file +{ + "hash": "169521cbf4b919b69880fa76746cd4f78bbc99f5", + "user_agents": [ + { + "vendor": "Acer", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2.1; en-us; A100 Build\/HTK55D) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true + }, + { + "vendor": "Acer", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1; en-us; A110 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Acer", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; A200 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.3", + "Webkit": "534.30", + "Safari": "4.0", + "Build": "IML74K" + }, + "model": "A200" + }, + { + "vendor": "Acer", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; A500 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Acer", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; A501 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Acer", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; A701 Build\/JRO03H) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Acer", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; B1-A71 Build\/JZO54K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Acer", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; B1-710 Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Acer", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; A1-810 Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Safari\/537.31", + "mobile": true, + "tablet": true + }, + { + "vendor": "Acer", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; nl-nl; A1-810 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Acer", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Acer; Allegro)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Acer", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; A3-A10 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.36", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.2.2", + "Build": "JDQ39", + "Webkit": "537.36", + "Chrome": "32.0.1700.99" + } + }, + { + "vendor": "Acer", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; A1-811 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Acer", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; A1-830 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Acer", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; A3-A11 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; en-in; MB525 Build\/GWK74; CyanogenMod-7.2.0) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; it-it; ALCATEL ONE TOUCH 918D Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false, + "version": { + "Android": "2.3.5", + "Webkit": "533.1", + "Safari": "4.0", + "Build": "GRJ90" + }, + "model": "ONE TOUCH 918D" + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; ALCATEL ONE TOUCH 991 Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false, + "version": { + "Android": "2.3.6", + "Webkit": "533.1", + "Safari": "4.0", + "Build": "GRJ90" + }, + "model": "ONE TOUCH 991" + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; ALCATEL ONE TOUCH 993D Build\/ICECREAM) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false, + "version": { + "Android": "4.0.4", + "Webkit": "534.30", + "Safari": "4.0", + "Build": "ICECREAM" + }, + "model": "ONE TOUCH 993D" + }, + { + "vendor": "Alcatel", + "user_agent": "ALCATEL_A392G\/1.0 ObigoInternetBrowser\/Q05A[TF013513002719521000000013182904148]", + "mobile": true, + "tablet": false, + "model": "A392G" + }, + { + "vendor": "Alcatel", + "user_agent": "ALCATEL_3020D\/1.0 ObigoInternetBrowser\/Q03C", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2; ALCATEL ONE TOUCH 5037A Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "ALCATEL_3020G\/1.0 ObigoInternetBrowser\/Q03C", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "ALCATEL_3041D\/1.0 ObigoInternetBrowser\/Q03C", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 5037E Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 5037X Build\/JDQ39) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 5037X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ONE TOUCH 6012A Build\/JDQ39) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-nz; ONE TOUCH 6012A Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ONE TOUCH 6012D Build\/JDQ39) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; ONE TOUCH 6012D Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; En-us; ONE TOUCH 6012E Build\/JDQ39) AppleWebKit\/534.30 (KHTML, Like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ONE TOUCH 6012X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.12975 YaBrowser\/13.12.1599.12975 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; bg-bg; ONE TOUCH 6012X Build\/JDQ39) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 6012X_orange Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; fr-fr; ALCATEL ONE TOUCH 6012X_orange Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; fr-fr; 6016E Build\/JLS36C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-us; ALCATEL ONE TOUCH 6016E Build\/JLS36C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; 6016X Build\/JLS36C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; ALCATEL ONE TOUCH 6016X Build\/JLS36C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; ru-ru; 6016X Build\/JLS36C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 6032A Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.170 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; ru-ru; ALCATEL ONE TOUCH 6032X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-nz; ALCATEL ONE TOUCH 7040A Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; th-th; ALCATEL ONE TOUCH 7040D Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7040D Build\/JDQ39) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7040E Build\/JDQ39) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; it-it; ALCATEL ONE TOUCH 7041D Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7041D Build\/JDQ39) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7041X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; pt-pt; ALCATEL ONE TOUCH 7041X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020A Build\/JDQ39) AppleWebKit\/537.36 (KHTML, Like Gecko) Chrome\/30.0.1599.92 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 8020A Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020D Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; es-es; ALCATEL ONE TOUCH 8020D Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020E Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 8020E Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Alcatel", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 8020X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Allview", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; ALLVIEW P5 Build\/IML74K) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Allview", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us ; ALLVIEW SPEEDI Build\/IMM76D) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1\/UCBrowser\/8.5.3.246\/145\/355", + "mobile": true, + "tablet": true + }, + { + "vendor": "Allview", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; AllviewCity Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Allview", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; ALLVIEWSPEED Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Amazon", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Silk\/3.4 Mobile Safari\/535.19 Silk-Accelerated =true", + "mobile": true, + "tablet": true + }, + { + "vendor": "Amazon", + "user_agent": "Mozilla\/5.0 (Linux; U; en-US) AppleWebKit\/528.5+ (KHTML, like Gecko, Safari\/528.5+) Version\/4.0 Kindle\/3.0 (screen 600x800; rotate)", + "mobile": true, + "tablet": true, + "version": { + "Webkit": "528.5+", + "Kindle": "3.0", + "Safari": "4.0" + }, + "model": "Kindle" + }, + { + "vendor": "Amazon", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; KFOTE Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.3", + "Build": "IML74K", + "Webkit": "534.30", + "Safari": "4.0" + } + }, + { + "vendor": "Amazon", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; WFJWAE Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Amazon", + "user_agent": "Mozilla\/5.0 (Linux; U; en-us; KFTT Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Silk\/3.21 Safari\/535.19 Silk-Accelerated=true", + "mobile": true, + "tablet": true + }, + { + "vendor": "Amazon", + "user_agent": "Mozilla\/5.0 (Linux; U; en-us; KFTHWI Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Silk\/3.21 Safari\/535.19 Silk-Accelerated=true", + "mobile": true, + "tablet": true + }, + { + "vendor": "Amazon", + "user_agent": "Mozilla\/5.0 (Linux; U; en-us; KFJWI Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Silk\/3.21 Safari\/535.19 Silk-Accelerated=true", + "mobile": true, + "tablet": true + }, + { + "vendor": "Amazon", + "user_agent": "Mozilla\/5.0 (Linux; U; en-us; KFSOWI Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Silk\/3.21 Safari\/535.19 Silk-Accelerated=true", + "mobile": true, + "tablet": true + }, + { + "vendor": "Amazon", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1; xx-xx; T720-WIFI Build\/ECLAIR) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17", + "mobile": true, + "tablet": true + }, + { + "vendor": "Apple", + "user_agent": "iTunes\/9.1.1", + "mobile": false, + "tablet": false + }, + { + "vendor": "Apple", + "user_agent": "iTunes\/11.0.2 (Windows; Microsoft Windows 8 x64 Business Edition (Build 9200)) AppleWebKit\/536.27.1", + "mobile": false, + "tablet": false + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPod touch; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit\/537.51.1 (KHTML, like Gecko) Version\/7.0 Mobile\/11A4449d Safari\/9537.53", + "mobile": true, + "tablet": false + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit\/420+ (KHTML, like Gecko) Version\/3.0 Mobile\/1A543 Safari\/419.3", + "mobile": true, + "tablet": false, + "version": { + "Webkit": "420+", + "Safari": "3.0" + } + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit\/528.18 (KHTML, like Gecko) Version\/4.0 Mobile\/7A341 Safari\/528.16", + "mobile": true, + "tablet": false, + "version": { + "iOS": "3_0", + "Webkit": "528.18", + "Safari": "4.0" + }, + "model": "iPhone" + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit\/534.46 (KHTML, like Gecko) Version\/5.1 Mobile\/9B206 Safari\/7534.48.3", + "mobile": true, + "tablet": false, + "version": { + "iOS": "5_1_1", + "Webkit": "534.46", + "Mobile": "9B206", + "Safari": "5.1" + }, + "model": "iPhone" + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPod; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Version\/6.0 Mobile\/10A403 Safari\/8536.25", + "mobile": true, + "tablet": false, + "version": { + "iOS": "6_0", + "Webkit": "536.26", + "Mobile": "10A403", + "Safari": "6.0" + }, + "model": "iPod" + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPad; CPU OS 5_1_1 like Mac OS X; en-us) AppleWebKit\/534.46.0 (KHTML, like Gecko) CriOS\/21.0.1180.80 Mobile\/9B206 Safari\/7534.48.3 (6FF046A0-1BC4-4E7D-8A9D-6BF17622A123)", + "mobile": true, + "tablet": true, + "version": { + "iOS": "5_1_1", + "Webkit": "534.46.0", + "Chrome": "21.0.1180.80", + "Mobile": "9B206" + }, + "model": "iPad" + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Version\/6.0 Mobile\/10A403 Safari\/8536.25", + "mobile": true, + "tablet": true, + "version": { + "iOS": "6_0", + "Webkit": "536.26", + "Safari": "6.0", + "Mobile": "10A403" + }, + "model": "iPad" + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; en-us) AppleWebKit\/533.17.9 (KHTML, like Gecko) Version\/5.0.2 Mobile\/8C148 Safari\/6533.18.5", + "mobile": true, + "tablet": true, + "version": { + "iOS": "4_2_1", + "Webkit": "533.17.9", + "Safari": "5.0.2", + "Mobile": "8C148" + }, + "model": "iPad" + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit\/531.21.10 (KHTML, like Gecko) Version\/4.0.4 Mobile\/7B334b Safari\/531.21.10", + "mobile": true, + "tablet": true, + "version": { + "iOS": "3_2", + "Webkit": "531.21.10", + "Safari": "4.0.4", + "Mobile": "7B334b" + }, + "model": "iPad" + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X; da-dk) AppleWebKit\/534.46.0 (KHTML, like Gecko) CriOS\/21.0.1180.82 Mobile\/10A523 Safari\/7534.48.3", + "mobile": true, + "tablet": false, + "version": { + "iOS": "6_0_1", + "Webkit": "534.46.0", + "Chrome": "21.0.1180.82", + "Mobile": "10A523" + }, + "model": "iPhone" + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Version\/6.0 Mobile\/10A523 Safari\/8536.25", + "mobile": true, + "tablet": false, + "version": { + "iOS": "6_0_1", + "Webkit": "536.26", + "Safari": "6.0", + "Mobile": "10A523" + }, + "model": "iPhone" + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X; ru-ru) AppleWebKit\/536.26 (KHTML, like Gecko) CriOS\/23.0.1271.100 Mobile\/10B142 Safari\/8536.25", + "mobile": true, + "tablet": false, + "version": { + "iOS": "6_1", + "Webkit": "536.26", + "Chrome": "23.0.1271.100", + "Mobile": "10B142" + }, + "model": "iPhone" + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Version\/6.0 Mobile\/10B329 Safari\/8536.25", + "mobile": true, + "tablet": false, + "version": { + "iOS": "6_1_3", + "Webkit": "536.26", + "Safari": "6.0", + "Mobile": "10B329" + }, + "model": "iPhone" + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Coast\/1.0.2.62956 Mobile\/10B329 Safari\/7534.48.3", + "mobile": true, + "tablet": true, + "version": { + "Coast": "1.0.2.62956" + } + }, + { + "vendor": "Apple", + "user_agent": "CheckMyBus iOS mobile App 0.9.0 (iPhone; iPhone OS\/7.1.1)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit\/537.51.1 (KHTML, like Gecko) Version\/7.0 Mobile\/11A465 Safari\/9537.53", + "mobile": true, + "tablet": true + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit\/600.1.4 (KHTML, like Gecko) CriOS\/38.0.2125.59 Mobile\/12A405 Safari\/600.1.4", + "mobile": true, + "tablet": false + }, + { + "vendor": "Apple", + "user_agent": "VendorAppName\/1.7.0 (iPhone; iOS 8.1.2; Scale\/3.00)", + "mobile": true, + "tablet": false, + "version": { + "iOS": "8.1.2" + }, + "model": "iPhone" + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPad; CPU OS 9_0 like Mac OS X) AppleWebKit\/601.1.17 (KHTML, like Gecko) Version\/8.0 Mobile\/13A175 Safari\/600.1.4", + "mobile": true, + "tablet": true + }, + { + "vendor": "Apple", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit\/601.1.37 (KHTML, like Gecko) Version\/8.0 Mobile\/13A4293g Safari\/600.1.4", + "mobile": true, + "tablet": false + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Qilive 97R Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; Archos 50 Platinum Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; ARCHOS 80G9 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.1; fr-fr; A101IT Build\/FROYO) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Archos 101 Neon Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Archos 101 Cobalt Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 80 TITANIUM Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; ARCHOS 101 Titanium Build\/JRO03H) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 70b TITANIUM Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; de-de; Archos 80 Xenon Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Archos 79 Xenon Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 101 Titanium Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 80XSK Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS FAMILYPAD 2 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; ARCHOS 97B TITANIUM Build\/JRO03H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ARCHOS 101 XS 2 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; ARCHOS 80b PLATINUM Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Archos 70 Xenon Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; ARCHOS 97 CARBON Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 97 TITANIUMHD Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Archos 90 Neon Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 1.6; de-de; Archos5 Build\/Donut) AppleWebKit\/528.5+ (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/525.20.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Archos", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS GAMEPAD Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2.1; en-us; Transformer TF101 Build\/HTK75) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true, + "version": { + "Android": "3.2.1", + "Webkit": "534.13", + "Safari": "4.0" + }, + "model": "Transformer TF101" + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; Transformer Build\/JRO03L) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; ASUS Transformer Pad TF300T Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; fr-fr; Transformer Build\/JZO54K; CyanogenMod-10) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; asus_laptop Build\/IMM76L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; PadFone 2 Build\/JRO03L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; PadFone 2 Build\/JRO03L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.1.1", + "Build": "JRO03L", + "Webkit": "534.30", + "Safari": "4.0" + } + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.1; ME301T Build\/JOP40D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.2.1", + "Build": "JOP40D" + } + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.1; ME173X Build\/JOP40D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.2.1", + "Build": "JOP40D" + } + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; TF300T Build\/JDQ39E) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.2.2", + "Build": "JDQ39E" + } + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; K00C Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; K00E Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; K00F Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; K00L Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ME302KL Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Safari\/537.31", + "mobile": true, + "tablet": true + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; K010 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/42.0.2311.111 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "ASUS", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; K017 Build\/KVT49L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/42.0.2311.111 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9300; en) AppleWebKit\/534.8+ (KHTML, like Gecko) Version\/6.0.0.546 Mobile Safari\/534.8+", + "mobile": true, + "tablet": false, + "version": { + "Webkit": "534.8+", + "BlackBerry": "6.0.0.546" + }, + "model": "BlackBerry 9300" + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9360; en-US) AppleWebKit\/534.11+ (KHTML, like Gecko) Version\/7.0.0.400 Mobile Safari\/534.11+", + "mobile": true, + "tablet": false + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9700; he) AppleWebKit\/534.8+ (KHTML, like Gecko) Version\/6.0.0.723 Mobile Safari\/534.8+", + "mobile": true, + "tablet": false + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9700; en-US) AppleWebKit\/534.8 (KHTML, like Gecko) Version\/6.0.0.448 Mobile Safari\/534.8", + "mobile": true, + "tablet": false + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9790; en-GB) AppleWebKit\/534.11+ (KHTML, like Gecko) Version\/7.1.0.714 Mobile Safari\/534.11+", + "mobile": true, + "tablet": false, + "version": { + "Webkit": "534.11+", + "BlackBerry": "7.1.0.714" + }, + "model": "BlackBerry 9790" + }, + { + "vendor": "BlackBerry", + "user_agent": "Opera\/9.80 (BlackBerry; Opera Mini\/7.0.29990\/28.2504; U; en) Presto\/2.8.119 Version\/11.10", + "mobile": true, + "tablet": false + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9981; en-GB) AppleWebKit\/534.11+ (KHTML, like Gecko) Version\/7.1.0.342 Mobile Safari\/534.11+", + "mobile": true, + "tablet": false + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9800; en-GB) AppleWebKit\/534.8+ (KHTML, like Gecko) Version\/6.0.0.546 Mobile Safari\/534.8+", + "mobile": true, + "tablet": false + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9780; es) AppleWebKit\/534.8 (KHTML, like Gecko) Version\/6.0.0.480 Mobile Safari\/534.8", + "mobile": true, + "tablet": false + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9810; en-US) AppleWebKit\/534.11 (KHTML, like Gecko) Version\/7.0.0.583 Mobile Safari\/534.11", + "mobile": true, + "tablet": false + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9860; es) AppleWebKit\/534.11+ (KHTML, like Gecko) Version\/7.0.0.576 Mobile Safari\/534.11+", + "mobile": true, + "tablet": false + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit\/534.11 (KHTML, like Gecko) Version\/7.1.0.523 Mobile Safari\/534.11", + "mobile": true, + "tablet": false + }, + { + "vendor": "BlackBerry", + "user_agent": "BlackBerry8520\/5.0.0.592 Profile\/MIDP-2.1 Configuration\/CLDC-1.1 VendorID\/136", + "mobile": true, + "tablet": false + }, + { + "vendor": "BlackBerry", + "user_agent": "BlackBerry8520\/5.0.0.1067 Profile\/MIDP-2.1 Configuration\/CLDC-1.1 VendorID\/603", + "mobile": true, + "tablet": false + }, + { + "vendor": "BlackBerry", + "user_agent": "BlackBerry8520\/5.0.0.1036 Profile\/MIDP-2.1 Configuration\/CLDC-1.1 VendorID\/611", + "mobile": true, + "tablet": false, + "version": { + "BlackBerry": "5.0.0.1036", + "VendorID": "611" + }, + "model": "BlackBerry8520" + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9220; en) AppleWebKit\/534.11+ (KHTML, like Gecko) Version\/7.1.0.337 Mobile Safari\/534.11+", + "mobile": true, + "tablet": false + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit\/536.2+ (KHTML, like Gecko) Version\/7.2.1.0 Safari\/536.2+", + "mobile": true, + "tablet": true + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (BB10; Touch) AppleWebKit\/537.1+ (KHTML, like Gecko) Version\/10.0.0.1337 Mobile Safari\/537.1+", + "mobile": true, + "tablet": false + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (BB10; Touch) AppleWebKit\/537.10+ (KHTML, like Gecko) Version\/10.0.9.2372 Mobile Safari\/537.10+", + "mobile": true, + "tablet": false + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (BB10; Touch) \/537.10+ (KHTML, like Gecko) Version\/10.0.9.2372 Mobile Safari\/537.10+", + "mobile": true, + "tablet": false, + "version": { + "BlackBerry": "10.0.9.2372" + } + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2.1; en-us; Transformer TF101 Build\/HTK75) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true, + "version": { + "Android": "3.2.1", + "Webkit": "534.13", + "Safari": "4.0" + }, + "model": "Transformer TF101" + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; A200 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.3", + "Webkit": "534.30", + "Safari": "4.0" + }, + "model": "A200" + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; A500 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.3", + "Webkit": "534.30", + "Safari": "4.0" + }, + "model": "A500" + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; A501 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.3", + "Webkit": "534.30", + "Safari": "4.0" + }, + "model": "A501" + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; Transformer Build\/JRO03L) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.1.1", + "Webkit": "535.19", + "Chrome": "18.0.1025.166" + }, + "model": "Transformer" + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; ASUS Transformer Pad TF300T Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.1.1", + "Webkit": "535.19", + "Chrome": "18.0.1025.166" + }, + "model": "Transformer Pad TF300T" + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; fr-fr; Transformer Build\/JZO54K; CyanogenMod-10) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.1.2", + "Webkit": "534.30", + "Safari": "4.0", + "Build": "JZO54K" + }, + "model": "Transformer" + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; B1-A71 Build\/JZO54K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.1.2", + "Webkit": "535.19", + "Chrome": "18.0.1025.166" + }, + "model": "B1-A71" + }, + { + "vendor": "BlackBerry", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Acer; Allegro)", + "mobile": true, + "tablet": false, + "version": { + "Windows Phone OS": "7.5", + "Trident": "5.0", + "IE": "9.0" + }, + "model": "Allegro" + }, + { + "vendor": "Dell", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 1.6; en-gb; Dell Streak Build\/Donut AppleWebKit\/528.5+ (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/ 525.20.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Dell", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; hd-us; Dell Venue Build\/GWK74; CyanogenMod-7.2.0) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Dell", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; DELL; Venue Pro)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Dell", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; Venue 8 3830 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Dell", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; Venue 7 3730 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Dell", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; Venue 7 HSPA+ Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Dell", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-us; Venue 8 3830 Build\/JSS15Q) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Dell", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2; zh-cn; Dell Streak 10 Pro Build\/HTJ85B) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true + }, + { + "vendor": "Google", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Google", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Nexus 4 Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.40 Mobile Safari\/537.31 OPR\/14.0.1074.54070", + "mobile": true, + "tablet": false, + "version": { + "Android": "4.2.2", + "Build": "JDQ39", + "Webkit": "537.31", + "Opera": "14.0.1074.54070" + } + }, + { + "vendor": "Google", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Nexus 4 Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", + "mobile": true, + "tablet": false, + "version": { + "Android": "4.2.2", + "Chrome": "26.0.1410.58" + } + }, + { + "vendor": "Google", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; Google Nexus 4 - 4.1.1 - API 16 - 768x1280 Build\/JRO03S) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Google", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; Google Galaxy Nexus - 4.1.1 - API 16 - 720x1280 Build\/JRO03S) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Google", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; Nexus 7 Build\/JRO03D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Google", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2; Nexus 7 Build\/JOP40C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Google", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; Nexus 7 Build\/JZ054K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.1.2", + "Chrome": "18.0.1025.166" + } + }, + { + "vendor": "Google", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; cs-cz; Nexus S Build\/JZO54K; CyanogenMod-10.0.0) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Google", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; Nexus 10 Build\/JWR66Y) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Google", + "user_agent": "Mozilla\/5.0 (Linux; U; Android; en_us; Nexus 7 Build\/) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 NetFrontLifeBrowser\/2.3 Mobile (Dragonfruit)", + "mobile": true, + "tablet": true + }, + { + "vendor": "Google", + "user_agent": "Mozilla\/5.0 (Linux; Android 5.1; Nexus 5 Build\/LMY47D) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/39.0.0.0 Mobile Safari\/537.36 momoWebView\/6.3.1 android\/404(Nexus 5;android 5.1;zh_CN;10;netType\/1)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Google", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; Nexus 10 Build\/JWR66Y) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "HP", + "user_agent": "Mozilla\/5.0 (hp-tablet; Linux; hpwOS\/3.0.5; U; en-GB) AppleWebKit\/534.6 (KHTML, like Gecko) wOSBrowser\/234.83 Safari\/534.6 TouchPad\/1.0", + "mobile": true, + "tablet": true + }, + { + "vendor": "HP", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; HP Slate 7 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "HP", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HP Slate 7 Build\/JRO03H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "HP", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; HP 8 Build\/1.0.7_WW-FIR-13) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "HP", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HP Slate 10 HD Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "HP", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HP Slate 8 Pro Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "HP", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Slate 21 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Safari\/537.36 OPR\/22.0.1485.78487", + "mobile": true, + "tablet": true + }, + { + "vendor": "HP", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HP SlateBook 10 x2 PC Build\/4.3-17r20-03-23) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (X11; Linux x86_64; Z520m; en-ca) AppleWebKit\/534.24 (KHTML, like Gecko) Chrome\/11.0.696.34 Safari\/534.24", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "HTC_Touch_HD_T8282 Mozilla\/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 1.5; en-us; ADR6200 Build\/CUPCAKE) AppleWebKit\/528.5+ (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/525.20.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1; xx-xx; Desire_A8181 Build\/ERE27) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1-update1; de-de; HTC Desire 1.19.161.5 Build\/ERE27) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1-update1; en-gb; HTC Desire Build\/ERE27) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; fr-fr; HTC Desire Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; en-dk; Desire_A8181 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; xx-xx; 001HT Build\/FRF91) AppleWebKit\/525.10+ (KHTML, like Gecko) Version\/3.0.4 Mobile Safari\/523.12.2", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; xx-xx; HTCA8180\/1.0 Android\/2.2 release\/06.23.2010 Browser\/WAP 2.0 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.2; de-at; HTC Desire Build\/FRG83G) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.2; en-sk; Desire_A8181 Build\/FRG83G) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3; xx-xx; HTC\/DesireS\/1.07.163.1 Build\/GRH78C) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-lv; HTC_DesireZ_A7272 Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; en-us; ADR6300 Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; en-gb; HTC\/DesireS\/2.10.161.3 Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC_DesireS_S510e Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; en-us; Inspire 4G Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; de-de; HTC Explorer A310e Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; en-gb; HTC_ChaCha_A810e Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; nl-nl; HTC_DesireHD_A9191 Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC Desire S Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-au; HTC Desire Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; de-de; HTC_DesireHD Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; ru-ua; HTC_WildfireS_A510e Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; en-us; HTC Vision Build\/GRI40; ILWT-CM7) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0; xx-xx; HTC_GOF_U\/1.05.161.1 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; hu-hu; HTC Sensation Z710e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; zh-cn; HTC Sensation XE with Beats Audio Z715e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; pl-pl; EVO3D_X515m Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ru-ru; HTC_One_S Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ru-ru; HTC_One_V Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; zh-cn; HTC_A320e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; zh-tw; HTC Desire V Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; PG86100 Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-nl; SensationXE_Beats_Z715e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; ADR6425LVW 4G Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One V Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; cs-ee; Sensation_Z710e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; HTC Evo 4G Build\/MIUI) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; Desire HD Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-my; HTC_One_X Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; it-it; IncredibleS_S710e Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; fr-fr; HTC_Desire_S Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC Butterfly Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; EVO Build\/JRO03C) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.169 Mobile Safari\/537.22", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTCSensation Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; GT-S6312 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC 7 Mozart T8698; QSD8x50)", + "mobile": true, + "tablet": false, + "version": { + "IE": "9.0", + "Windows Phone OS": "7.5", + "Trident": "5.0" + }, + "model": "7 Mozart T8698" + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2.1; en-gb;HTC_Flyer_P512 Build\/HTK75C) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.1; zh-tw; HTC PG09410 Build\/HMJ15) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 HTC MOZART)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Mondrian T8788)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Mozart T8698)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Mozart)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Mozart; Orange)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Pro T7576)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Pro)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Schubert T9292)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Surround)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Trophy T8686)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Trophy)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Eternity)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Gold)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; HD2 LEO)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; HD2)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; HD7 T9292)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; HD7)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; iPad 3)", + "mobile": true, + "tablet": true + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; LEO)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Mazaa)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Mondrian)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Mozart T8698)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Mozart)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; mwp6985)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; PC40100)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; PC40200)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; PD67100)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; PI39100)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; PI86100)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar 4G)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar C110e)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar C110e; 1.08.164.02)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar C110e; 2.05.164.01)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar C110e; 2.05.168.02)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar; Orange)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Schuber)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Schubert T9292)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Schubert)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Spark)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Surround)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; T7575)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; T8697)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; T8788)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; T9295)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; T9296)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; TITAN X310e)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Titan)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Torphy T8686)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; X310e)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC_blocked; T8788)", + "mobile": true, + "tablet": false, + "version": { + "IE": "9.0", + "Windows Phone OS": "7.5", + "Trident": "5.0" + }, + "model": "T8788" + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; HTC One S Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; de-de; HTC One X Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-th; HTC One V Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; HTC One X Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-id; HTC One X Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One S Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One X Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-at; HTC One S Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03L) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; HTC One S Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.123 Mobile Safari\/537.22", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.123 Mobile Safari\/537.22", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.169 Mobile Safari\/537.22", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One X Build\/JZO54K) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.169 Mobile Safari\/537.22", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; es-pe; HTC One V Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.169 Mobile Safari\/537.22", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One V Build\/IML74K) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; HTC One X Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 Maxthon\/4.0.4.1000", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One X Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.133 Mobile Safari\/535.19 AlexaToolbar\/alxf-2.17", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One Build\/JZO54K) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One S Build\/IML74K) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One Build\/JZO54K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; de-de; HTC One Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31 OPR\/14.0.1074.58201", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; es-es; HTC One S Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.64 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.64 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One V Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.64 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39E) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One XL Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.63 Mobile Safari\/537.36 OPR\/15.0.1162.60140", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; HTC One S Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One X Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.24 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "HTC One X Linux\/3.0.13 Android\/4.1.9 Release\/10.12.2012 Browser\/AppleWebKit534.30 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 Mobile Safari\/534.30 Android 4.0.1;", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-tw; HTC One 801e Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; HTC One X Build\/IMM76D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.63 Mobile Safari\/537.36 OPR\/15.0.1162.61541", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One XL Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X+ Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; HTC One X Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30\/4.05d.1002.m7", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-in; HTC One V Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One V Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; HTC One X Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 MicroMessenger\/5.0.1.352", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; HTC One X Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; HTC One Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One SV Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One V Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One mini Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; HTC One Build\/IMM76D) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One 801e Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-ch; HTC One Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; nl-nl; HTC One X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; zh-cn; HTC One S Build\/IML74K) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17 T5\/2.0 baidubrowser\/3.1.6.4 (Baidu; P1 4.0.3)", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X+ Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-us; HTC One 801e Build\/JSS15J) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.4.1.362 U3\/0.8.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4; HTC One Build\/KRT16S.H5) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.94 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One SV Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.1; ru-ru; HTC One Build\/JOP40D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; ru-ru; HTC One 801e Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One 801e Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One mini Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.12975 YaBrowser\/13.12.1599.12975 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4; HTC One Build\/KRT16S) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-us; HTC One Build\/JSS15J) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One X Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JWR66Y.H1) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.93 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; de-at; HTC One Build\/JSS15J) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.135 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X+ Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One dual sim Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; HTC One S Build\/IMM76D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One max Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.132 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One mini Build\/JSS15Q) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One 801e Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-cn; HTC One Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 MicroMessenger\/5.2.380", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.166 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One X Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.133 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.166 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.166 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X+ Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.166 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.132 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; HTC One X Build\/IMM76D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; it-it; HTC One S Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-kw; HTC One X+ Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One max Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36 MicroMessenger\/5.3.0.49_r693790.420", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ru; HTC One V Build\/IML74K) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.7.5.418 U3\/0.8.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36 MicroMessenger\/5.2.1.381", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One mini Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; ru-ru; HTC One mini Build\/KOT49H) AppleWebKit\/537.16 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.16", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ru; HTC One V Build\/IML74K) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.8.0.435 U3\/0.8.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One 801e Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; HTC One X - 4.2.2 - API 17 - 720x1280 Build\/JDQ39E) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One V Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.94 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X+ Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.128 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.128 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.128 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One_M8 Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One VX Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.76 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One V Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One dual sim Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One dual sim Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36 OPR\/22.0.1485.78487", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X+ Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One_M8 Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One 801e Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One 801e Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One X Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36 OPR\/22.0.1485.81203", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One 801e Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One mini Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-tw; HTC One S Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One_M8 Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; HTC One V Build\/IML74K) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.9.2.467 U3\/0.8.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One mini Build\/JSS15Q) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; en-us; HTC One_M8 Build\/KOT49H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One dual sim Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.72 Mobile Safari\/537.36 OPR\/19.0.1340.69721", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One_M8 Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One SV Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36 ACHEETAHI\/2100050056", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; HTC One_M8 Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One_M8 Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JWR66Y.H1) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-tw; HTC One SV Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One mini Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; HTC One_M8 Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36 [FBAN\/FB4A;FBAV\/21.0.0.23.12;]", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-tw; HTC One X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; HTC One_M8 Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; ru-si; HTC One X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 MicroMessenger\/6.0.0.67_r853700.483 NetType\/WIFI", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36 [FBAN\/FB4A;FBAV\/22.0.0.15.13;]", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-US; HTC One X Build\/JRO03C) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/10.0.1.512 U3\/0.8.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; HTC One Build\/KTU84P.H1) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36 [FBAN\/FB4A;FBAV\/22.0.0.15.13;]", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One mini Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36 [FBAN\/FB4A;FBAV\/22.0.0.15.13;]", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One SV Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; HTC One_M8 Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36 [FBAN\/FB4A;FBAV\/22.0.0.15.13;]", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-tw; HTC One X+ Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; HTC One_M8 Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36 BingWeb\/5.2.0.20140710", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; es-mx; HTC One S Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 [FBAN\/FB4A;FBAV\/23.0.0.22.14;]", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One mini Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.3; es-es; HTC One 801e Build\/KTU84L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One mini Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X+ Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.69 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; HTC One S Build\/JRO03C) AppleWebKit\/537.16 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.16", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36 [FB_IAB\/FB4A;FBAV\/24.0.0.30.15;]", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; en-th; HTC One Build\/KOT49H) AppleWebKit\/537.16 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.16", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; es-ar; HTC One X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 [FB_IAB\/FB4A;FBAV\/24.0.0.30.15;]", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36 [FB_IAB\/FB4A;FBAV\/24.0.0.30.15;]", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; es-us; HTC One X+ Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 [FB_IAB\/FB4A;FBAV\/24.0.0.30.15;]", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; es-mx; HTC One S Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 [FB_IAB\/FB4A;FBAV\/24.0.0.30.15;]", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36 [FB_IAB\/FB4A;FBAV\/24.0.0.30.15;]", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.89 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One dual sim Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.89 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36 [FB_IAB\/FB4A;FBAV\/25.0.0.19.30;]", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 5.0.1; HTC One_M8 Build\/LRX22C) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/37.0.0.0 Mobile Safari\/537.36 [FB_IAB\/FB4A;FBAV\/25.0.0.19.30;]", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.89 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; HTC One_M8 Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.109 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One mini Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.109 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "HTC", + "user_agent": "Mozilla\/5.0 (Linux; Android 5.0.1; HTC One_M8 Build\/LRX22C.H5) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.109 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Huwaei", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1-update1; bg-bg; Ideos S7 Build\/ERE27) AppleWebKit\/525.10+ (KHTML, like Gecko) Version\/3.0.4 Mobile Safari\/523.12.2", + "mobile": true, + "tablet": true + }, + { + "vendor": "Huwaei", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1; en-us; Ideos S7 Build\/ERE27) AppleWebKit\/525.10+ (KHTML, like Gecko) Version\/3.0.4 Mobile Safari\/523.12.2", + "mobile": true, + "tablet": true + }, + { + "vendor": "Huwaei", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; lt-lt; U8660 Build\/HuaweiU8660) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Huwaei", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; ru-ru; HUAWEI-U8850 Build\/HuaweiU8850) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Huwaei", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2; pl-pl; MediaPad Build\/HuaweiMediaPad) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true + }, + { + "vendor": "Huwaei", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2; nl-nl; HUAWEI MediaPad Build\/HuaweiMediaPad) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true + }, + { + "vendor": "Huwaei", + "user_agent": "HUAWEI_T8951_TD\/1.0 Android\/4.0.4 (Linux; U; Android 4.0.4; zh-cn) Release\/05.31.2012 Browser\/WAP2.0 (AppleWebKit\/534.30) Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Huwaei", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; ar-eg; MediaPad 7 Youth Build\/HuaweiMediaPad) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Huwaei", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; zh-cn; HW-HUAWEI_C8815\/C8815V100R001C541B135; 540*960; CTC\/2.0) AppleWebKit\/534.30 (KHTML, like Gecko) Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Huwaei", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-cn; HW-HUAWEI_C8813D\/C8813DV100R001C92B172; 480*854; CTC\/2.0) AppleWebKit\/534.30 (KHTML, like Gecko) Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Huwaei", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-cn; HW-HUAWEI_Y300C\/Y300CV100R001C92B168; 480*800; CTC\/2.0) AppleWebKit\/534.30 (KHTML, like Gecko) Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Lava", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; Iris 349 Build\/MocorDroid2.3.5) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Lava", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; iris402+ Build\/iris402+) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Lava", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; IRIS402 Build\/LAVAIRIS402) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Lava", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; iris405 Build\/LAVAIRIS405) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Lava", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; IRIS_501 Build\/LAVAIRIS501) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Lava", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; iris402e Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Lava", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; iris503e Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Lava", + "user_agent": "UCWEB\/2.0 (Linux; U; Opera Mini\/7.1.32052\/30.3697; en-US; IRIS402) U2\/1.0.0 UCBrowser\/9.1.1.420 Mobile", + "mobile": true, + "tablet": false + }, + { + "vendor": "Lava", + "user_agent": "UCWEB\/2.0 (MIDP-2.0; U; Adr 4.2.2; en-US; IRIS402) U2\/1.0.0 UCBrowser\/9.1.1.420 U2\/1.0.0 Mobile", + "mobile": true, + "tablet": false + }, + { + "vendor": "Lava", + "user_agent": "UCWEB\/2.0 (Linux; U; Opera Mini\/7.1.32052\/30.3697; en-US; IRIS355) U2\/1.0.0 UCBrowser\/9.1.1.420 Mobile", + "mobile": true, + "tablet": false + }, + { + "vendor": "Lava", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; iris356 Build\/irisIRIS356) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.5.0.360 U3\/0.8.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Lava", + "user_agent": "UCWEB\/2.0 (Linux; U; Opera Mini\/7.1.32052\/30.3697; en-US; iris356) U2\/1.0.0 UCBrowser\/9.0.2.389 Mobile", + "mobile": true, + "tablet": false + }, + { + "vendor": "Lava", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; iris500 Build\/iris500) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Lava", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; iris700 Build\/iris700) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Lava", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; QPAD E704 Build\/JDQ39) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/36.0.1985.131 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lava", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2; xx-xx; IvoryS Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lava", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-US; E-TAB IVORY Build\/E702) AppleWebKit\/534.31 (KHTML, like Gecko) UCBrowser\/9.3.0.321 U3\/0.8.0 Mobile Safari\/534.31", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lava", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; tr-tr; E-TAB Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": 0, + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-au; TBLT10Q-32GB Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; es-es; IdeaTab_A1107 Build\/MR1) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; IdeaTab A2107A-H Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-au; ThinkPad Tablet Build\/ThinkPadTablet_A400_03) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "UCWEB\/2.0 (Linux; U; Opera Mini\/7.1.32052\/30.3697; en-US; IdeaTabA1000-G) U2\/1.0.0 UCBrowser\/9.2.0.419 Mobile", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; IdeaTabA1000-F Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.1; Lenovo A3000-H Build\/JOP40D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.117 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; IdeaTab A3000-F Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.360", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1; zh-cn; Lenovo-A3000-H\/S100) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.1 Mobile Safari\/534.300", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; es-us; IdeaTab A3000-F Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; IdeaTab A2107A-H Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; IdeaTab A2107A-H Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; es-es; IdeaTabA2109A Build\/JRO03R) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; nl-nl; IdeaTabA2109A Build\/JRO03R) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; es-es; IdeaTab_A1107 Build\/MR1) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.300", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; IdeaTab S6000-H Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; IdeaTab S6000-F Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Lenovo B8000-F Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2;it-it; Lenovo B8000-F\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; it-it; Lenovo B6000-F\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2.2 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Lenovo B6000-F Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; IdeaPadA10 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.166 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; Ideapad K1 Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; de-de; IdeaPad A1 Build\/GRK393; CyanogenMod-7) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; Lenovo B8080-H Build\/JLS36C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; hu-hu; Lenovo A3500-FL Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; Lenovo A7600-F Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; Lenovo A5500-F Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Lenovo", + "user_agent": "Lenovo A390 Linux\/3.0.13 Android\/4.4.2 Release\/04.03.2013 Browser\/AppleWebKit534.30 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 Mobile Safari\/534.30 Android 4.0.1;", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; LG-VS410PP Build\/GRK39F) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; en-us; LG-P509 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 MMS\/LG-Android-MMS-V1.0\/1.2", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.2; pt-br; LG-P350f Build\/FRG83G) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 MMS\/LG-Android-MMS-V1.0\/1.2", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us; LG-P500 Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 MMS\/LG-Android-MMS-V1.0\/1.2", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us; LS670 Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; ru-ru; LG-E510 Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 MMS\/LG-Android-MMS-V1.0\/1.2", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; en-us; VS910 4G Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; nl-nl; LG-P700 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build\/IML74K) AppleWebkit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; LG-F160S Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; nl-nl; LG-E610v\/V10f Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; LG-E612 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; LG-F180K Build\/JZO54K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; LG-V500 Build\/JDQ39B) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; LG-LW770 Build\/IMM76I) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; LG-V510 Build\/KOT49H.L004) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG E-900)", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-C900)", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-C900k)", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-E900)", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-E900; Orange)", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-E900h)", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-Optimus 7)", + "mobile": true, + "tablet": false + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.0.1; ja-jp; L-06C Build\/HRI66) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.0; en-us; LG-V900 Build\/HRI39) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; en-gb; LG-V700 Build\/KOT49I.A1403851714) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.1599.103 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; LG-V500 Build\/KOT49I.V50020d) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "LG", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; en-us; LG-V410\/V41010d Build\/KOT49I.V41010d) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.1599.103 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2; xx-xx; HM NOTE 1W Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 MobilSafari\/534.30 XiaoMi\/MiuiBrowser\/1.0", + "mobile": true, + "tablet": true + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.1; zh-cn; MI-ONE Plus Build\/ITL41D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-cn; MI 2SC Build\/JRO03L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-cn; MI 2S Build\/JRO03L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; zh-tw; MI 1S Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.8; zh-cn; xiaomi2 Build\/GRK39F) AppleWebKit\/533.1 (KHTML, like Gecko)Version\/4.0 MQQBrowser\/4.4 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; es-es; MI 2A Build\/miui.es JRO03L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.1; zh-cn; MI 3 Build\/JOP40D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; MI 1S Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; MI 3W Build\/JLS36C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; HM 1SC Build\/JLS36C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-us; HM 1SW Build\/JLS36C) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.36 XiaoMi\/MiuiBrowser\/2.0.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; HM NOTE 1W Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.36 XiaoMi\/MiuiBrowser\/2.0.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; MI-ONE C1 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.4; en-us; MI 4W Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.36 XiaoMi\/MiuiBrowser\/2.0.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Mi", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4; MI PAD Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Microsoft", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0; Touch; .NET4.0E; .NET4.0C; Tablet PC 2.0)", + "mobile": true, + "tablet": true, + "version": { + "IE": "10.0", + "Windows NT": "6.2", + "Trident": "6.0" + } + }, + { + "vendor": "Microsoft", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Microsoft", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0; Touch)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Microsoft", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0; Touch; ARMBJS)", + "mobile": true, + "tablet": true + }, + { + "vendor": "Microsoft", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident\/6.0; Touch; MASMJS)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Microsoft", + "user_agent": "Mozilla\/5.0 (Windows NT 6.2; WOW64; rv:25.0) Gecko\/20130626 Firefox\/25.0", + "mobile": false, + "tablet": false + }, + { + "vendor": "Microsoft", + "user_agent": "Mozilla\/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko\/20100101 Firefox\/22.0", + "mobile": false, + "tablet": false + }, + { + "vendor": "Microsoft", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident\/6.0; MDDCJS)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Microsoft", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident\/6.0; MDDCJS)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Microsoft", + "user_agent": "Mozilla\/5.0 (Windows NT 6.2; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.52 Safari\/537.36 OPR\/15.0.1147.130", + "mobile": false, + "tablet": false + }, + { + "vendor": "Microsoft", + "user_agent": "Mozilla\/5.0 (Windows NT 6.2; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.116 Safari\/537.36", + "mobile": false, + "tablet": false + }, + { + "vendor": "Microsoft", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident\/6.0; Touch; MDDCJS; WebView\/1.0)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "MOT-W510\/08.11.05R MIB\/BER2.2 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 EGE\/1.0 UP.Link\/6.3.0.0.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.2; zh-cn; ME722 Build\/MLS2GC_2.6.0) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; en-us; DROIDX Build\/4.5.1_57_DX8-51) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; en-us; MB855 Build\/4.5.1A-1_SUN-254_13) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; es-us; MB526 Build\/4.5.2-51_DFL-50) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-ca; MB860 Build\/4.5.2A-51_OLL-17.8) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; en-us; MOT-XT535 Build\/V1.540) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; ko-kr; A853 Build\/SHOLS_U2_05.26.3; CyanogenMod-7.1.2) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.0; en-us; Xoom Build\/HRI39) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.1; en-us; Xoom Build\/HMJ25) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; DROID RAZR 4G Build\/6.7.2-180_DHD-16_M4-31) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; Xoom Build\/IMM76L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; pt-br; XT687 Build\/V2.27D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false, + "version": { + "Android": "4.0.4", + "Webkit": "534.30", + "Safari": "4.0" + }, + "model": "XT687" + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; es-es; MOT-XT910 Build\/6.7.2-180_SPU-19-TA-11.6) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT910 Build\/9.8.2O-124_SPUL-17) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT915 Build\/2_32A_2031) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT919 Build\/2_290_2017) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.64 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT925 Build\/9.8.2Q-50-XT925_VQLM-20) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT907 Build\/9.8.1Q-66) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT901 Build\/9.8.2Q-50_SLS-13) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; DROID BIONIC Build\/9.8.2O-72_VZW-22) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; XT1022 Build\/KXC20.82-14) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.4; en-in; XT1022 Build\/KXC21.5-40) AppleWebKit\/537.16 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.16", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; XT1025 Build\/KXC20.82-13) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; XT1052 Build\/KLA20.16-2.16.2) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; XT1052 Build\/13.9.0Q2.X_83) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; XT1053 Build\/13.9.0Q2.X_61) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; XT1053 Build\/13.9.0Q2.X_55) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; XT1056 Build\/13.9.0Q2.X-116-MX-17-6-2) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.64 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; XT1031 Build\/KXB20.9-1.10-1.18-1.1) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; XT1032 Build\/KXB21.14-L1.40) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; de-de; XT1032 Build\/KLB20.9-1.10-1.24-1.1) AppleWebKit\/537.16 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.16", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; XT1034 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-us; XT1034 Build\/14.10.0Q3.X-84-16) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; XT1035 Build\/14.10.0Q3.X-23) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; XT1039 Build\/KXB21.14-L1.31) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; XT919 Build\/2_290_2002) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT919 Build\/2_290_2004) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; XT920 Build\/2_290_2014) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT920 Build\/2_310_2014) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; XT905 Build\/7.7.1Q_GCIRD-16) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.169 Mobile Safari\/537.22", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; XT908 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; XT897 Build\/7.7.1Q-6_SPR-ASANTI_LE-18) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 5.0.2; XT1032 Build\/LXB22.46-28.1) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/43.0.2357.92 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 5.1.1; Moto E Build\/LMY47V) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/39.0.0.0 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Motorola", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; XT1021 Build\/KTU84Q) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Nokia200\/2.0 (12.04) Profile\/MIDP-2.1 Configuration\/CLDC-1.1 UCWEB\/2.0 (Java; U; MIDP-2.0; en-US; nokia200) U2\/1.0.0 UCBrowser\/8.9.0.251 U2\/1.0.0 Mobile UNTRUSTED\/1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Nokia6303iclassic\/5.0 (06.61) Profile\/MIDP-2.1 Configuration\/CLDC-1.1 Mozilla\/5.0 AppleWebKit\/420+ (KHTML, like Gecko) Safari\/420+", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "nokian73-1\/UC Browser7.8.0.95\/69\/400 UNTRUSTED\/1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Nokia2760\/2.0 (06.82) Profile\/MIDP-2.1 Configuration\/CLDC-1.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Nokia3650\/1.0 SymbianOS\/6.1 Series60\/1.2 Profile\/MIDP-1.0 Configuration\/CLDC-1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "NokiaN70-1\/5.0737.3.0.1 Series60\/2.8 Profile\/MIDP-2.0 Configuration\/CLDC-1.1\/UC Browser7.8.0.95\/27\/352", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (S60V3; U; ru; NokiaN73) AppleWebKit\/530.13 (KHTML, like Gecko) UCBrowser\/8.6.0.199\/28\/444\/UCWEB Mobile", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (S60V3; U; ru; NokiaC5-00.2)\/UC Browser8.5.0.183\/28\/444\/UCWEB Mobile", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (S60V3; U; ru; NokiaC5-00.2) AppleWebKit\/530.13 (KHTML, like Gecko) UCBrowser\/8.7.0.218\/28\/352\/UCWEB Mobile", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (Series40; NokiaC3-00\/08.63; Profile\/MIDP-2.1 Configuration\/CLDC-1.1) Gecko\/20100401 S40OviBrowser\/2.2.0.0.33", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Opera\/9.80 (Series 60; Opera Mini\/7.0.31380\/28.2725; U; es) Presto\/2.8.119 Version\/11.10", + "mobile": true, + "tablet": false, + "version": { + "Opera Mini": "7.0.31380", + "Presto": "2.8.119" + } + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.2 NokiaC7-00\/025.007; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.37 Mobile Safari\/533.4 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.2 NokiaX7-00\/022.014; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.37 Mobile Safari\/533.4 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.3 NokiaE6-00\/111.140.0058; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/535.1 (KHTML, like Gecko) NokiaBrowser\/8.3.1.4 Mobile Safari\/535.1 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.3 NokiaC6-01\/111.040.1511; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/535.1 (KHTML, like Gecko) NokiaBrowser\/8.3.1.4 Mobile Safari\/535.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.3 NokiaC6-01; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.4.2.6 Mobile Safari\/533.4 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.3 Nokia700\/111.030.0609; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.4.2.6 Mobile Safari\/533.4 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.3 Nokia700\/111.020.0308; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.4.1.14 Mobile Safari\/533.4 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.3 NokiaN8-00\/111.040.1511; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/535.1 (KHTML, like Gecko) NokiaBrowser\/8.3.1.4 Mobile Safari\/535.1 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.3 Nokia701\/111.030.0609; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.4.2.6 Mobile Safari\/533.4 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 Nokia6120c\/3.83; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 Nokia6120ci\/7.02; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 Nokia6120c\/7.10; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaE66-1\/510.21.009; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaE71-1\/110.07.127; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaN95-3\/20.2.011 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaE51-1\/200.34.36; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaE63-1\/500.21.009; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaN82\/10.0.046; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaE52-1\/052.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.6.2", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaE52-1\/@version@; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.26 Mobile Safari\/533.4 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaC5-00\/031.022; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.3.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaC5-00.2\/081.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.32 Mobile Safari\/533.4 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; U; Series60\/3.2 NokiaN79-1\/32.001; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; U; Series60\/3.2 Nokia6220c-1\/06.101; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaC5-00.2\/071.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.26 Mobile Safari\/533.4 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaE72-1\/081.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.32 Mobile Safari\/533.4 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaC5-00\/061.005; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.6.2 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 NokiaX6-00\/40.0.002; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.33 Mobile Safari\/533.4 3gpp-gb", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 Nokia5800d-1\/60.0.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.33 Mobile Safari\/533.4 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 NokiaC5-03\/12.0.023; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.6.9 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 Nokia5228\/40.1.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.7.4 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 Nokia5230\/51.0.002; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.33 Mobile Safari\/533.4 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 Nokia5530c-2\/32.0.007; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.6.9 3gpp-gba", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 NokiaN97-1\/21.0.045; Profile\/MIDP-2.1 Configuration\/CLDC-1.1) AppleWebKit\/525 (KHTML, like Gecko) BrowserNG\/7.1.4", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 NokiaN97-4\/30.0.004; Profile\/MIDP-2.1 Configuration\/CLDC-1.1) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.28 3gpp-gba", + "mobile": true, + "tablet": false, + "version": { + "Symbian": "9.4", + "Webkit": "533.4", + "NokiaBrowser": "7.3.1.28" + }, + "model": "NokiaN97-4" + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; 7 Mozart T8698)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; 710)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; 800)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; 800C)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; 800C; Orange)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; 900)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; HD7 T9292)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; LG E-900)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 610)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 710)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 710; Orange)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 710; T-Mobile)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 710; Vodafone)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800) UP.Link\/5.1.2.6", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800; Orange)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800; SFR)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800; T-Mobile)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800; vodafone)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; Lumia 800c)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 900)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; Lumia 920)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident\/6.0; IEMobile\/10.0; ARM; Touch; NOKIA; Lumia 920)", + "mobile": true, + "tablet": false, + "version": { + "IE": "10.0", + "Windows Phone OS": "8.0", + "Trident": "6.0" + }, + "model": "Lumia 920" + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; lumia800)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Nokia 610)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Nokia 710)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Nokia 800)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Nokia 800C)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Nokia 900)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; Nokia)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; SGH-i917)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; TITAN X310e)", + "mobile": true, + "tablet": false, + "version": { + "Windows Phone OS": "7.5", + "Trident": "5.0" + }, + "model": "TITAN X310e" + }, + { + "vendor": "Nokia", + "user_agent": "Mozilla\/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident\/7.0; Touch; rv:11.0; IEMobile\/11.0; NOKIA; Lumia 520) like iPhone OS 7_0_3 Mac OS X AppleWebKit\/537 (KHTML, like Gecko) Mobile Safari\/537", + "mobile": true, + "tablet": false + }, + { + "vendor": "Onda", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; V975i Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/42.0.2311.108 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Onda", + "user_agent": "Mozilla\/5.0 (Android; Tablet; rv:37.0) Gecko\/37.0 Firefox\/37.0", + "mobile": true, + "tablet": true + }, + { + "vendor": "Onda", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; V975m Core4 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Onda", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; fr-fr; V975m Core4 Build\/JSS15J) AppleWebKit\/537.16 (KHTML, like Gecko) Version\/4.0 Safari\/537.16", + "mobile": true, + "tablet": true + }, + { + "vendor": "Onda", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; V975m Core4 Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/41.0.2272.96 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Onda", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; V812 Core4 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "AdvanDigital", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; E1C Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "AdvanDigital", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; id-id; T3C Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Ainol", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; en-us; Ainol Novo8 Advanced Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Ainol", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; Novo10 Hero Build\/20121115) AppleWebKit\/535.19 (KHTML like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Ainol", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; es-es; novo9-Spark Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "AllFine", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; FINE7 GENIUS Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Amoi", + "user_agent": "Amoi 8512\/R18.0 NF-Browser\/3.3", + "mobile": true, + "tablet": false, + "model": "8512" + }, + { + "vendor": "Arnova", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; fr-fr; AN9G2I Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "AudioSonic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-au; T-17B Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Blaupunkt", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; Endeavour 800NG Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Broncho", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; es-es; Broncho N701 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "bq", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; es-es; bq Livingstone 2 Build\/1.1.7 20121018-10:33) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "bq", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; es-es; bq Edison Build\/1.1.10-1015 20121230-18:00) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "bq", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; Maxwell Lite Build\/v1.0.0.ICS.maxwell.20120920) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "bq", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; zh-tw; bq Maxwell Plus Build\/1.0.0 20120913-10:39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "bq", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; Aquaris E10 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Captiva", + "user_agent": "Opera\/9.80 (X11; Linux zvav; U; de) Presto\/2.8.119 Version\/11.10 Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; CAPTIVA PAD 10.1 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Casio", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us; C771 Build\/C771M120) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "ChangJia", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; pt-br; TPC97113 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "ChangJia", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; TPC7102 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Celkon", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; Celkon CT 910+ Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Celkon", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-in; CT-1 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Celkon", + "user_agent": "CELKON.C64\/R2AE SEMC-Browser\/4.0.3 Profile\/MIDP-2.0 Configuration\/CLDC-1.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Celkon", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; Celkon A125 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Celkon", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-US; Celkon*A86 Build\/Celkon_A86) AppleWebKit\/528.5+ (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/525.20.1 UCBrowser\/8.7.0.315 Mobile", + "mobile": true, + "tablet": false + }, + { + "vendor": "Celkon", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; Celkon A.R 40 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Coby", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; en-us; MID7010 Build\/FRF85B) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Coby", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; MID7048 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Coby", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; MID8042 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Concorde", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; hu-hu; ConCorde Tab T10 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Concorde", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; hu-hu; ConCorde tab PLAY Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Cresta", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; nl-nl; CRESTA.CTP888 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Cube", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ru-ru; CUBE U9GT 2 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Danew", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; es-es; Dslide 700 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.3", + "Build": "IML74K", + "Webkit": "534.30", + "Safari": "4.0" + }, + "model": "Dslide 700" + }, + { + "vendor": "DanyTech", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Genius Tab Q4 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Digma", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ru-ru; iDx10 3G Build\/ICS.b02ref.20120331) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "DPS", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; DPS Dream 9 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "ECS", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; it-it; TM105A Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.4", + "Build": "IMM76D", + "Webkit": "534.30" + } + }, + { + "vendor": "Eboda", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Supreme Dual Core X190 Build\/JRO03C) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.1.1", + "Webkit": "534.30", + "Safari": "4.0" + } + }, + { + "vendor": "Eboda", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Essential A160 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Eboda", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; E-Boda Supreme X80 Dual Core Build\/ICS.g12refM806A1YBD.20120925) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Eboda", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ro-ro; E-boda essential smile Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Eboda", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Supreme X80 Dual Core Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Eboda", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Supreme XL200IPS Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Evolio", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; Evolio X7 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Evolio", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ro-ro; ARIA_Mini_wifi Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Fly", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; Fly IQ440; Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Fly", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; FLY IQ256 Build\/GRK39F) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Fujitsu", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ja-jp; F-10D Build\/V21R48A) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.3", + "Build": "V21R48A", + "Webkit": "534.30", + "Safari": "4.0" + } + }, + { + "vendor": "Fujitsu", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ru-ru; M532 Build\/IML74K) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.3", + "Build": "IML74K", + "Webkit": "534.30", + "Safari": "4.0" + } + }, + { + "vendor": "FX2", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; FX2 PAD7 RK Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Galapad", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-tw; G1 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.1.1", + "Webkit": "534.30", + "Safari": "4.0", + "Build": "JRO03C" + } + }, + { + "vendor": "GoClever", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; el-gr; GOCLEVER TAB A103 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "GoClever", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; zh-tw; A7GOCLEVER Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "GoClever", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; GOCLEVER TAB A104 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "GoClever", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; cs-cz; GOCLEVER TAB A93.2 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "GoClever", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; sk-sk; GOCLEVER TAB A971 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "GoClever", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; lv-lv; GOCLEVER TAB A972BK Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "GoClever", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; fr-fr; GOCLEVER TAB A104.2 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "GoClever", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; pt-pt; GOCLEVER TAB T76 Build\/MID) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "GU", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; vi-vn; TX-A1301 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.4", + "Build": "IMM76D", + "Webkit": "534.30", + "Safari": "4.0" + } + }, + { + "vendor": "GU", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; da-dk; Q702 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.3", + "Build": "IML74K", + "Webkit": "534.30", + "Safari": "4.0" + } + }, + { + "vendor": "HCL", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; U1 Build\/HCL ME Tablet U1) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "HCL", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; U1 Build\/HCL ME Tablet U1) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "HCL", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; Connect-3G-2.0 Build\/HCL) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "HCL", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; pt-br; X1 Build\/HCL ME Tablet X1) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Hudl", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Hudl HT7S3 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Iconbit", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; NT-3702M Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Safari\/537.36 OPR\/16.0.1212.65583", + "mobile": true, + "tablet": true + }, + { + "vendor": "Iconbit", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; NetTAB SPACE II Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "iJoy", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; fr-fr; Tablet Planet II-v3 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Intenso", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1.;de-de; INM8002KP Build\/JR003H) AppleWebKit\/534.30 (KHTML, like Gecko)Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.1.1.", + "Webkit": "534.30", + "Safari": "4.0" + } + }, + { + "vendor": "Intenso", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; TAB1004 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "INQ", + "user_agent": "INQ1\/R3.9.12 NF-Browser\/3.5", + "mobile": true, + "tablet": false, + "model": "INQ1" + }, + { + "vendor": "Intex", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3; en-US; Cloud_X2 Build\/MocorDroid4.0.1) AppleWebKit\/528.5+ (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/525.20.1 UCBrowser\/9.2.0.419 Mobile", + "mobile": true, + "tablet": false + }, + { + "vendor": "Intex", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; Cloud Y2 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Intex", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-in; Cloud X5 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "IRU", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; M702pro Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "JXD", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; F3000 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Karbonn", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; ST10 Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Kobo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.0; en-us;) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 (Kobo Touch)", + "mobile": true, + "tablet": true, + "version": { + "Android": "2.0", + "Webkit": "533.1", + "Safari": "4.0" + } + }, + { + "vendor": "Megafon", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; ru-ru; MegaFon V9 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Megafon", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; MT7A Build\/JRO03C) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Safari\/537.31", + "mobile": true, + "tablet": true + }, + { + "vendor": "MediaTek", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; fr-fr; MT8377 Build\/JRO03C) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30\/4.05d.1002.m7", + "mobile": true, + "tablet": true + }, + { + "vendor": "Micromax", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; Micromax A110 Build\/JRO03C) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.169 Mobile Safari\/537.22", + "mobile": true, + "tablet": false, + "version": { + "Android": "4.1.1", + "Build": "JRO03C", + "Webkit": "537.22", + "Chrome": "25.0.1364.169" + } + }, + { + "vendor": "Micromax", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0; xx-xx; Micromax P250(Funbook) Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Webkit": "534.30", + "Android": "4.0", + "Build": "IMM76D", + "Safari": "4.0" + } + }, + { + "vendor": "Modecom", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; pl-pl; FreeTAB 1014 IPS X4+ Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "MSI", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; el-gr; MSI Enjoy 10 Plus Build\/1.2) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Nabi", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.1; en-us; NABI-A Build\/MASTER) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "NEC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ja-jp; N-08D Build\/A5001911) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "NEC", + "user_agent": "Mozilla\/5.0 (Linux; U; Android AAA; BBB; N-06D Build\/CCC) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Nexo", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; pl-pl; NEXO 3G Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30 ACHEETAHI\/2100050074", + "mobile": true, + "tablet": true + }, + { + "vendor": "Nibiru", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-tw; Nibiru H1 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Nook", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.1; en-us; NOOK BNRV200 Build\/ERD79 1.4.3) Apple WebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true, + "version": { + "Android": "2.2.1", + "Webkit": "533.1", + "Safari": "4.0" + } + }, + { + "vendor": "Nook", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; NOOK BNTV400 Build\/ICS) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.4", + "Build": "ICS", + "Webkit": "534.30", + "Safari": "4.0" + } + }, + { + "vendor": "Nook", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; BNTV600 Build\/IMM76L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36 Hughes-PFB\/CID5391275.AID1376709964", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.4", + "Build": "IMM76L", + "Webkit": "537.36", + "Chrome": "28.0.1500.94" + } + }, + { + "vendor": "Oneplus", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; A0001 Build\/JLS36C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Oneplus", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; xx-xx; A0001 Build\/JLS36C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Odys", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; LOOX Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Odys", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; LOOX Plus Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Odys", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.X; de-de; XENO10 Build\/ODYS XENO 10) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Odys", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.2; de-de; ODYS Space Build\/I700T_P7_T04_TSCL_FT_R_0_03_1010_110623) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Odys", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; ODYS-EVO Build\/ODYS-EVO) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Odys", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.X; de-de; Xelio 10 Pro Build\/ODYS_Xelio) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Odys", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; NEO_QUAD10 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Odys", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.X; de-de; Xelio10Pro Build\/ODYS_Xelio) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Odys", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.1; en-us; ODYS-Xpress Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Odys", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; de-de; XELIO7PHONETAB Build\/IMM76I) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Odys", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; XELIO10EXTREME Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Odys", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; de-de; XELIO Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30 Mobile UCBrowser\/3.2.1.441", + "mobile": true, + "tablet": true + }, + { + "vendor": "Odys", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; XELIOPT2 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Odys", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; nl-nl; ODYS-NOON Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "OverMax", + "user_agent": "OV-SteelCore(B) Mozilla\/5.0 (iPad; CPU OS 5_0_1 like Mac OS X) AppleWebKit\/534.46 (KHTML, like Gecko) Version\/5.1 Mobile\/9A405 Safari\/7534.48.3", + "mobile": true, + "tablet": true + }, + { + "vendor": "OverMax", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; pl-pl; OV-SteelCore Build\/ICS.g08refem611.20121010) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "YONESTablet", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; pl-pl; BC1077 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Pantech", + "user_agent": "PANTECH-C790\/JAUS08312009 Browser\/Obigo\/Q05A Profile\/MIDP-2.0 Configuration\/CLDC-1.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Pantech", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.1; ko-kr; SKY IM-A600S Build\/FRG83) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Pantech", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us; ADR8995 4G Build\/GRI40) AppleWebKit\/533.1 (KHTML like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Pantech", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2.1; en-us; PantechP4100 Build\/HTK75) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true + }, + { + "vendor": "Philips", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; Philips W336 Build\/IMM76D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.45 Mobile Safari\/537.36 OPR\/15.0.1162.59192", + "mobile": true, + "tablet": false + }, + { + "vendor": "Philips", + "user_agent": "Philips_T3500\/V1 Linux\/3.4.5 Android\/4.2.2 Release\/03.26.2013 Browser\/AppleWebKit534.30 Mobile Safari\/534.30 MBBMS\/2.2 System\/Android 4.2.2;", + "mobile": true, + "tablet": false + }, + { + "vendor": "Philips", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Philips W3568 Build\/Philips_W3568) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Philips", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; Philips W832 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Philips", + "user_agent": "Mozilla\/5.0 (Linux;U;Android 4.2.2;es-us;Philips S388 Build\/JDQ39) AppleWebkit\/534.30 (HTML,like Gecko) Version\/4.0 Mobile Safari\/534.30;", + "mobile": true, + "tablet": false + }, + { + "vendor": "Philips", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; Philips W536 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Philips", + "user_agent": "Mozilla\/5.0 (Linux;U;Android 4.2.2;es-us;Philips S308 Build\/JDQ39) AppleWebkit\/534.30 (HTML,like Gecko) Version\/4.0 Mobile Safari\/534.30;", + "mobile": true, + "tablet": false + }, + { + "vendor": "Philips", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; ru-ru; Philips-W8500 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Philips", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; ru; Philips W8510 Build\/JDQ39) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.8.9.457 U3\/0.8.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Philips", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; ru-RU; Philips W3568 Build\/Philips W3568) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.1 Mobile Safari\/534.30;", + "mobile": true, + "tablet": false + }, + { + "vendor": "Philips", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Philips S388 Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Philips", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; Build\/PI3100.00.00.24) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Philips", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; W732 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Philips", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.1; PI7100_93 Build\/PI7100.C.00.00.11) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "PocketBook", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; en-ru; PocketBook A10 3G Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "PointOfView", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; POV_TAB-PROTAB30-IPS10 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Praktica", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; TP750 3GGSM Build\/IMM76I) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "PROSCAN", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; PLT8088 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.1.1", + "Build": "JRO03H", + "Webkit": "534.30", + "Safari": "4.0" + } + }, + { + "vendor": "PyleAudio", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; PTBL92BC Build\/IMM76D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.4", + "Build": "IMM76D", + "Webkit": "537.36", + "Chrome": "31.0.1650.59" + } + }, + { + "vendor": "RockChip", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.1; hu-hu; RK2818, Build\/MASTER) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "RockChip", + "user_agent": "Mozilla\/5.0 (Linux; U; Android Android 2.1-RK2818-1.0.0; zh-cn; MD701 Build\/ECLAIR) AppleWebKit\/530.17 (KHTML like Gecko) Version\/4.0 Mobile Safari\/530.17", + "mobile": true, + "tablet": true + }, + { + "vendor": "RossMoor", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.1; ru-ru; RM-790 Build\/JOP40D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "QMobile", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; A2 Build\/GRK39F) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "simvalley", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; de-de; SP-80 Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Skk", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1; en-us; CYCLOPS Build\/F10) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Storex", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; eZee_Tab903 Build\/JRO03H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.36", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.1.1", + "Build": "JRO03H", + "Webkit": "537.36" + } + }, + { + "vendor": "Storex", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; eZee'Tab785 Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Safari\/537.36", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.1.1", + "Build": "JRO03C", + "Webkit": "537.36" + } + }, + { + "vendor": "Storex", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; eZee'Tab971 Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.3", + "Build": "IML74K", + "Webkit": "535.19" + } + }, + { + "vendor": "Teclast", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; P98 3G\\xE5\\x85\\xAB\\xE6\\xA0\\xB8(A3HY) Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Teclast", + "user_agent": "QQ\\xe9\\x9f\\xb3\\xe4\\xb9\\x90HD 4.0.1 (iPad; iPhone OS 8.0; zh_CN)", + "mobile": true, + "tablet": true + }, + { + "vendor": "Teclast", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0; xx-xx; A15(E6C2) Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Teclast", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3; xx-xx; A10 Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Teclast", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; Teclast A10T Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Teclast", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; zh-cn; Teclast P85(A9D3) Build\/IMM76D) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Teclast", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; A70H Build\/JDQ39) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.8.0.435 U3\/0.8.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Tecno", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; TECNO P9 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Telstra", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; en-au; T-Hub2 Build\/TVA301TELBG3) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "texet", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; ru-ru; TM-7021 Build\/GB.m1ref.20120116) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true, + "version": { + "Android": "2.3.4", + "Webkit": "533.1", + "Safari": "4.0" + }, + "model": "TM-7021" + }, + { + "vendor": "Tolino", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 7 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.2.2", + "Build": "JDQ39", + "Webkit": "534.30", + "Safari": "4.0" + } + }, + { + "vendor": "Tolino", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 8.9 Build\/JDQ39) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.2.2", + "Build": "JDQ39", + "Webkit": "534.30", + "Safari": "4.0" + } + }, + { + "vendor": "Tolino", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; tolino tab 7 Build\/JDQ39) AppleWebkit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.57 Safari\/537.36 OPR\/18.0.1290.67495", + "mobile": true, + "tablet": true + }, + { + "vendor": "Tolino", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 7 Build\/JDQ39) AppleWebkit\/537.36 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Toshiba", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; TOSHIBA; TSUNAGI)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Toshiba", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; it-it; TOSHIBA_FOLIO_AND_A Build\/TOSHIBA_FOLIO_AND_A) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true, + "version": { + "Android": "2.2", + "Webkit": "533.1", + "Safari": "4.0" + } + }, + { + "vendor": "Trekstor", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ST70408-1 Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Safari\/537.31", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.2.2", + "Build": "JDQ39", + "Webkit": "537.31", + "Chrome": "26.0.1410.58" + } + }, + { + "vendor": "Trekstor", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; engb; Build\/IMM76D) AppleWebKit\/534.46 (KHTML, like Gecko) Version\/5.1 Mobile\/9A405 Safari\/7534.48.3 SurfTab_7.0", + "mobile": true, + "tablet": true + }, + { + "vendor": "Trekstor", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; VT10416-2 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Trekstor", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ST10216-2A Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30;SurfTab_10.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Ubislate", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; UBISLATE7C+ Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Visture", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; V97 HD Build\/LR-97JC) Apple WebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Visture", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; Visture V4 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Visture", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; Visture V4 HD Build\/Visture V4 HD) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Visture", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; es-es; Visture V5 HD Build\/Visture V5 HD) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Visture", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; Visture V10 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Versus", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; VS-TOUCHPAD 9 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Versus", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; Versus Touchpad 9.7 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Versus", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-gb; CnM-TOUCHPAD7 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30 BMID\/E67A45B1AB", + "mobile": true, + "tablet": true + }, + { + "vendor": "Versus", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; CnM TouchPad 7DC Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30 TwonkyBeamBrowser\/3.3.5-95 (Android 4.1.1; rockchip CnM TouchPad 7DC Build\/meizhi_V2.80.wifi8723.20121225.b11c800)", + "mobile": true, + "tablet": true + }, + { + "vendor": "Versus", + "user_agent": "OneBrowser\/3.5\/Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; TOUCHPAD 7 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Versus", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; TOUCHTAB Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.1.1", + "Build": "JRO03H", + "Webkit": "534.30", + "Safari": "4.0" + } + }, + { + "vendor": "Viewsonic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; ViewPad 10e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Viewsonic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; it-it; ViewPad7 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Viewsonic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.1; en-ca; ViewSonic VB733 Build\/FRG83) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Viewsonic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2; en-gb; ViewPad7X Build\/HTJ85B) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Viewsonic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; pt-br; ViewPad 10S Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Viewsonic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; VB100a Pro Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Vonino", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; Sirius_Evo_QS Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Vonino", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; Q8 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Wolder", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4; miTab LIVE Build\/KVT49L) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Wolder", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; pt-pt; miTab FUNK Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Wolfgang", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.1; nl-nl; AT-AS45q2 Build\/JOP40D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Xoro", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; PAD 9720QR Build\/PAD 9719QR) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Xoro", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; PAD720 Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "ZTE", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; V8200plus Build\/IMM76I) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.166 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Zync", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us ; Z909 Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1\/UCBrowser\/8.4.1.204\/145\/444", + "mobile": true, + "tablet": true + }, + { + "vendor": "Prestigio", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; PMP5297C_QUAD Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Prestigio", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; sk-sk; PMP7100D3G Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.4", + "Build": "IMM76D", + "Webkit": "534.30", + "Safari": "4.0" + }, + "model": "PMP7100D3G" + }, + { + "vendor": "Prestigio", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; sk-sk; PMP7280C3G Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 MobilSafari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Prestigio", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; PMT3017_WI Build\/KVT49L) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Prestigio", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; PMT3037_3G Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Prestigio", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; PMT5002_Wi Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Prestigio", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; el-gr; PMT5887_3G Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "MQQBrowser\/4.0\/Mozilla\/5.0 (Linux; U; Android 3.2; zh-cn; GT-P6800 Build\/HTJ85B) AppleWebKit\/533.1 (KHTML, like Gecko) Mobile Safari\/533.1", + "mobile": true, + "tablet": true, + "version": { + "MQQBrowser": "4.0" + } + }, + { + "vendor": "Samsung", + "user_agent": "SAMSUNG-SGH-P250-ORANGE\/P250BVHH8 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 UP.Browser\/6.2.3.3.c.1.101 (GUI) MMP\/2.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "SAMSUNG-GT-B2710\/B271MCXKF1 SHP\/VPP\/R5 Dolfin\/2.0 QTV\/5.3 SMM-MMS\/1.2.0 profile\/MIDP-2.1 configuration\/CLDC-1.1 OPN-B", + "mobile": true, + "tablet": false, + "version": { + "Dolfin": "2.0" + } + }, + { + "vendor": "Samsung", + "user_agent": "SAMSUNG-SGH-D900i\/1.0 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 UP.Browser\/6.2.3.3.c.1.101 (GUI) MMP\/2.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "SAMSUNG-GT-S5233T\/S5233TXEJE3 SHP\/VPP\/R5 Jasmine\/0.8 Qtv5.3 SMM-MMS\/1.2.0 profile\/MIDP-2.1 configuration\/CLDC-1.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (SAMSUNG; SAMSUNG-GT-S5380D\/S5380FXXKL3; U; Bada\/2.0; ru-ru) AppleWebKit\/534.20 (KHTML, like Gecko) Dolfin\/3.0 Mobile HVGA SMM-MMS\/1.2.0 OPN-B", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "SAMSUNG-GT-C3312\/1.0 NetFront\/4.2 Profile\/MIDP-2.0 Configuration\/CLDC-1.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 1.5; de-de; Galaxy Build\/CUPCAKE) AppleWebKit\/528.5 (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/525.20.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "SAMSUNG-GT-S3650\/S3650XEII3 SHP\/VPP\/R5 Jasmine\/1.0 Nextreaming SMM-MMS\/1.2.0 profile\/MIDP-2.1 configuration\/CLDC-1.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "JUC (Linux; U; 2.3.6; zh-cn; GT-S5360; 240*320) UCWEB7.9.0.94\/140\/352", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (SAMSUNG; SAMSUNG-GT-S5250\/S5250XEKJ3; U; Bada\/1.0; ru-ru) AppleWebKit\/533.1 (KHTML, like Gecko) Dolfin\/2.0 Mobile WQVGA SMM-MMS\/1.2.0 NexPlayer\/3.0 profile\/MIDP-2.1 configuration\/CLDC-1.1 OPN-B", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident\/3.1; IEMobile\/7.0; SAMSUNG; SGH-i917)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (SAMSUNG; SAMSUNG-GT-S8530\/S8530XXJKA; U; Bada\/1.2; cs-cz) AppleWebKit\/533.1 (KHTML, like Gecko) Dolfin\/2.2 Mobile WVGA SMM-MMS\/1.2.0 OPN-B", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 1.6; ru-ru; Galaxy Build\/Donut) AppleWebKit\/528.5+ (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/525.20.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1-update1; ru-ru; GT-I5500 Build\/ERE27) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; en-us; GALAXY_Tab Build\/MASTER) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; ja-jp; SC-01C Build\/FROYO) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; fr-fr; GT-I9000 Build\/FROYO) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.1; zh-cn; SCH-i909 Build\/FROYO) UC AppleWebKit\/534.31 (KHTML, like Gecko) Mobile Safari\/534.31", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; ja-jp; SC-01C Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-gb; GT-P1000 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; el-gr; GT-I9001 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-ca; SGH-I896 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; es-us; GT-S5660L Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 MicroMessenger\/4.5.1.261", + "mobile": true, + "tablet": false, + "version": { + "MicroMessenger": "4.5.1.261" + } + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; GT-S5660 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-S6102 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; pt-br; GT-S5367 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; fr-fr; GT-S5839i Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S7500 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S5830 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; es-us; GT-B5510L Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; pl-pl; GT-I9001-ORANGE\/I9001BVKPC Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; GT-I8150 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; nl-nl; GT-I9070 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S5360 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; es-us; GT-S6102B Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; GT-S5830i Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-I8160 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-S6802 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; ru-ru; GT-S5830 Build\/GRWK74; LeWa_ROM_Cooper_12.09.21) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-N7000 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.0.1; en-us; GT-P7100 Build\/HRI83) AppleWebkit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2; he-il; GT-P7300 Build\/HTJ85B) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2; en-gb; GT-P6200 Build\/HTJ85B) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-gb; GT-I9100 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; GT-I9100G Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; nl-nl; GT-P5100 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android-4.0.3; en-us; Galaxy Nexus Build\/IML74K) AppleWebKit\/535.7 (KHTML, like Gecko) CrMo\/16.0.912.75 Mobile Safari\/535.7", + "mobile": true, + "tablet": false, + "version": { + "Chrome": "16.0.912.75" + } + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; SGH-T989 Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false, + "version": { + "Chrome": "18.0.1025.166" + } + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P5100 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; GT-I9300 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; SPH-D710 Build\/IMM76I) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; zh-cn; GT-I9300 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300-ORANGE\/I9300BVBLG2 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; th-th; GT-I9300T Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-I9100 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us ; GT-I9100 Build\/IMM76D) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1\/UCBrowser\/8.4.1.204\/145\/355", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; GT-N7000 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; th-th; GT-P6800 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; SAMSUNG-SGH-I747 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; es-es; GT-P5110 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; GT-P5110 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; zh-cn; SAMSUNG-GT-S7568_TD\/1.0 Android\/4.0.4 Release\/07.15.2012 Browser\/AppleWebKit534.30 Build\/IMM76D) ApplelWebkit\/534.30 (KHTML,like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false, + "version": { + "Android": "4.0.4" + } + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P3100 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; tr-tr; GT-P3105 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-ca; GT-N8010 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-S7562 Build\/IMM76I) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; GT-N7100 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; GT-N7100 Build\/JZO54K) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.123 Mobile Safari\/537.22 OPR\/14.0.1025.52315", + "mobile": true, + "tablet": false, + "version": { + "Build": "JZO54K", + "Webkit": "537.22", + "Opera": "14.0.1025.52315" + } + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-hk; GT-N7105 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; GT-N8000 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; SGH-i747M Build\/JRO03L) AppleWebKit\/535.19(KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; Galaxy Nexus - 4.1.1 - with Google Apps - API 16 - 720x1280 Build\/JRO03S) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; GT-I8262 Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; it-it; Galaxy Nexus Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; SGH-I777 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; GT-S7710 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; GT-I9082 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; SGH-T999L Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; GT-P5210 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, Like Gecko) Chrome\/27.0.1453.90 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; en-us; SAMSUNG GT-I9200 Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Version\/1.0 Chrome\/18.0.1025.308 Mobile Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; zh-cn; SCH-I959 Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Version\/1.0 Chrome\/18.0.1025.308 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; nl-nl; SM-T310 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; en-us; SAMSUNG SM-P600 Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/1.5 Chrome\/28.0.1500.94 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; GT-N5100 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; en-us; SAMSUNG SM-T530NU Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/1.5 Chrome\/28.0.1500.94 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; SM-T800 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; fr-fr; SAMSUNG SM-T800 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/1.5 Chrome\/28.0.1500.94 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; SM-T700 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.517 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; CETUS)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; Focus I917 By TC)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; Focus i917)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; FOCUS S)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; GT-I8350)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; GT-i8700)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; GT-S7530)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; Hljchm's Wp)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; I917)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; OMNIA 7)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; OMNIA7 By MWP_HS)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; OMNIA7)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; OMNIA7; Orange)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i677)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i917)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i917.)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i917R)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i937)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SMG-917R)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG_blocked_blocked_blocked; OMNIA7; Orange)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG_blocked_blocked_blocked_blocked; OMNIA7; Orange)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SUMSUNG; OMNIA 7)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Windows NT 6.2; ARM; Trident\/7.0; Touch; rv:11.0; WPDesktop; SAMSUNG; GT-I8750) like Gecko", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Windows NT 6.2; ARM; Trident\/7.0; Touch; rv:11.0; WPDesktop; GT-I8750) like Gecko", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; en-gb; SAMSUNG GT-I9205 Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Version\/1.0 Chrome\/18.0.1025.308 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; GT-P7510 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; SHV-E160K\/VI10.1802 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 5.0.2; SM-T805 Build\/LRX22G) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/43.0.2357.92 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; SM-T116NQ Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/43.0.2357.92 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 5.0.2; SM-G9250 Build\/LRX22G; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/43.0.2357.121 Mobile Safari\/537.36 [FB_IAB\/FB4A;FBAV\/35.0.0.48.273;]", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; SM-T705Y Build\/KOT49H) AppleWebKit\/537.36(KHTML, like Gecko) Chrome\/42.0.2311.111 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; GT-I9505 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/1.5 Chrome\/28.0.1500.94 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Samsung", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; SM-T705 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/41.0.2272.45 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Sony", + "user_agent": "SonyEricssonK800i\/R1AA Browser\/NetFront\/3.3 Profile\/MIDP-2.0 Configuration\/CLDC-1.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1-update1; es-ar; SonyEricssonE15a Build\/2.0.1.A.0.47) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1-update1; pt-br; SonyEricssonU20a Build\/2.1.1.A.0.6) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-au; SonyEricssonX10i Build\/3.0.1.G.0.75) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; ru-ru; SonyEricssonST18i Build\/4.0.2.A.0.62) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; hr-hr; SonyEricssonST15i Build\/4.0.2.A.0.62) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; sk-sk; SonyEricssonLT15i Build\/4.0.2.A.0.62) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; th-th; SonyEricssonST27i Build\/6.0.B.3.184) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; de-de; SonyEricssonST25i Build\/6.0.B.3.184) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; pt-br; Xperia Tablet S Build\/TID0092) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.0.3", + "Build": "TID0092", + "Webkit": "534.30", + "Safari": "4.0" + } + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; LT18i Build\/4.1.A.0.562) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; Sony Tablet S Build\/TISU0R0110) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; es-es; Sony Tablet S Build\/TISU0143) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; SonyEricssonLT18i Build\/4.1.B.0.587) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; fr-ch; SonyEricssonSK17i Build\/4.1.B.0.587) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; SonyEricssonLT26i Build\/6.1.A.2.45) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; LT22i Build\/6.1.B.0.544) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; vi-vn; SonyEricssonLT22i Build\/6.1.B.0.544) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; ST23i Build\/11.0.A.5.5) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; ST23i Build\/11.0.A.2.10) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; LT28h Build\/6.1.E.3.7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; SGPT13 Build\/TJDS0170) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; ja-jp; SonySO-03E Build\/10.1.E.0.265) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.1.2", + "Build": "10.1.E.0.265", + "Webkit": "534.30", + "Safari": "4.0" + } + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; LT26w Build\/6.2.B.1.96) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; SGP321 Build\/10.3.1.A.0.33) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Safari\/537.31", + "mobile": true, + "tablet": true, + "version": { + "Android": "4.2.2", + "Build": "10.3.1.A.0.33", + "Webkit": "537.31", + "Chrome": "26.0.1410.58" + } + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; C5303 Build\/12.1.A.1.205) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; XL39h Build\/14.2.A.1.136) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; sv-se; C5503 Build\/10.1.1.A.1.273) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; C5502 Build\/10.1.1.A.1.310) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-cn; SonyL39t Build\/14.1.M.0.202) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-cn; L39u Build\/14.1.n.0.63) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; zh-tw; M35c Build\/12.0.B.5.37) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; M35c Build\/12.0.B.2.42) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; zh-CN; M35t Build\/12.0.C.2.42) AppleWebKit\/534.31 (KHTML, like Gecko) UCBrowser\/9.3.2.349 U3\/0.8.0 Mobile Safari\/534.31", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; D6502 Build\/17.1.A.2.69) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; D6503 Build\/17.1.A.0.504) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; D6543 Build\/17.1.A.2.55) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D2004 Build\/20.0.A.0.29) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-gb; D2005 Build\/20.0.A.1.12) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D2104 Build\/20.0.B.0.84) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D2105 Build\/20.0.B.0.74) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.170 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; pt-br; D2114 Build\/20.0.B.0.85) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D2302 Build\/18.0.B.1.23) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; S50h Build\/18.0.b.1.23) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.6.3.413 U3\/0.8.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D2303 Build\/18.0.C.1.13) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D2305 Build\/18.0.A.1.30) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D2306 Build\/18.0.C.1.7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D5303 Build\/19.0.1.A.0.207) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; D5306 Build\/19.1.A.0.264) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; zh-CN; XM50h Build\/19.0.D.0.269) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.7.6.428 U3\/0.8.0 Mobile Safari\/533.1", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; XM50t Build\/19.0.C.2.59) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D5322 Build\/19.0.D.0.253) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.131", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; M51w Build\/14.2.A.1.146) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; M51w Build\/14.2.A.1.146) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.1; D5102 Build\/18.2.A.0.9) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.1; D5103 Build\/18.1.A.0.11) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.1; D5106 Build\/18.1.A.0.11) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-gb; C6902 Build\/14.2.A.1.136) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 GSA\/3.2.17.1009776.arm", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; es-es; C6943 Build\/14.1.G.2.257) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; C6943 Build\/14.3.A.0.681) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; SGP412 Build\/14.1.B.3.320) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1; en-us; SonySGP321 Build\/10.2.C.0.143) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; SGP351 Build\/10.1.1.A.1.307) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; SGP341 Build\/10.4.B.0.569) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; SGP511 Build\/17.1.A.2.36) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; SGP512 Build\/17.1.A.2.36) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; fr-ch; SGP311 Build\/10.1.C.0.344) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; SGP312 Build\/10.1.C.0.344) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; de-de; SGP521 Build\/17.1.A.2.69) AppleWebKit\/537.16 (KHTML, like Gecko) Version\/4.0 Safari\/537.16", + "mobile": true, + "tablet": true + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; zh-cn; SGP541 Build\/17.1.A.2.36) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; SGP551 Build\/17.1.A.2.72) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Sony", + "user_agent": "SonyEricssonU5i\/R2CA; Mozilla\/5.0 (SymbianOS\/9.4; U; Series60\/5.0 Profile\/MIDP-2.1 Configuration\/CLDC-1.1) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 Safari\/525", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "SonyEricssonU5i\/R2AA; Mozilla\/5.0 (SymbianOS\/9.4; U; Series60\/5.0 Profile\/MIDP-2.1 Configuration\/CLDC-1.1) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 Safari\/525", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/4.0 (PDA; PalmOS\/sony\/model prmr\/Revision:1.1.54 (en)) NetFront\/3.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Opera\/9.80 (Linux mips; U; InettvBrowser\/2.2 (00014A;SonyDTV115;0002;0100) KDL40EX720; CC\/BEL; en) Presto\/2.7.61 Version\/11.00", + "mobile": false, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Opera\/9.80 (Linux armv7l; HbbTV\/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto\/2.12.362 Version\/12.11", + "mobile": false, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; es-ve; SonyST21a2 Build\/11.0.A.6.5) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; D2533 Build\/19.2.A.0.391) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; Xperia SP Build\/KTU84Q) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/41.0.2272.96 Mobile Safari\/537.36", + "mobile": true, + "tablet": false + }, + { + "vendor": "Sony", + "user_agent": "Mozilla \/ 5.0 (Linux; Android 5.0.2; SOT31 Build \/ 28.0.D.6.71) AppleWebKit \/ 537.36 (KHTML, like Gecko) Chrome \/ 39.0.2171.93 Safari \/ 537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Avant", + "user_agent": "Mozilla\/5.0 (Windows NT 6.1; WOW64; Trident\/7.0; Avant Browser; rv:11.0) like Gecko", + "mobile": false, + "tablet": false + }, + { + "vendor": "Avant", + "user_agent": "Mozilla\/5.0 (Windows NT 6.1; WOW64; Avant TriCore) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.101 Safari\/537.36", + "mobile": false, + "tablet": false + }, + { + "vendor": "Avant", + "user_agent": "Mozilla\/5.0 (Windows NT 5.1; rv:27.0; Avant TriCore) Gecko\/20100101 Firefox\/27.0", + "mobile": false, + "tablet": false + }, + { + "vendor": "Console", + "user_agent": "Mozilla\/5.0 (Nintendo WiiU) AppleWebKit\/536.28 (KHTML, like Gecko) NX\/3.0.3.12.14 NintendoBrowser\/3.1.1.9577.EU", + "mobile": false, + "tablet": false + }, + { + "vendor": "Console", + "user_agent": "Mozilla\/5.0 (Nintendo WiiU) AppleWebKit\/534.52 (KHTML, like Gecko) NX\/{Version No} NintendoBrowser\/{Version No}.US", + "mobile": false, + "tablet": false + }, + { + "vendor": "Console", + "user_agent": "Mozilla\/5.0 (Nintendo 3DS; U; ; en) Version\/1.7567.US", + "mobile": true, + "tablet": false + }, + { + "vendor": "Console", + "user_agent": "Mozilla\/5.0 (Nintendo 3DS; U; ; en) Version\/1.7498.US", + "mobile": true, + "tablet": false + }, + { + "vendor": "Console", + "user_agent": "Mozilla\/5.0 (PLAYSTATION 3 4.21) AppleWebKit\/531.22.8 (KHTML, like Gecko)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Console", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident\/5.0; Xbox)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident\/4.0; SV1; [eburo v4.0]; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3; .NET4.0C; .NET4.0E)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_10) AppleWebKit\/600.1.25 (KHTML, like Gecko) Version\/8.0 Safari\/600.1.25", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.111 Safari\/537.36", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (Windows NT 6.1) AppleWebKit\/537.36 (KHTML, like Gecko) Iron\/37.0.2000.0 Chrome\/37.0.2000.0 Safari\/537.36", + "mobile": false, + "tablet": false, + "version": { + "Iron": "37.0.2000.0" + } + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (X11; Linux i686) AppleWebKit\/537.36 (KHTML, like Gecko) Ubuntu Chromium\/32.0.1700.102 Chrome\/32.0.1700.102 Safari\/537.36", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko\/20100101 Firefox\/24.0", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko\/20100101 Firefox\/18.0 AlexaToolbar\/psPCtGhf-2.2", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko\/20100101 Firefox\/22.0", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (X11; Linux ppc; rv:17.0) Gecko\/20130626 Firefox\/17.0 Iceweasel\/17.0.7", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (X11; Linux) AppleWebKit\/535.22+ Midori\/0.4", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (Macintosh; U; Intel Mac OS X; en-us) AppleWebKit\/535+ (KHTML, like Gecko) Version\/5.0 Safari\/535.20+ Midori\/0.4", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (Windows NT 6.2; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.20 Safari\/537.36 OPR\/15.0.1147.18 (Edition Next)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (Windows NT 6.2) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.94 Safari\/537.36", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (Windows NT 5.2; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.94 Safari\/537.36", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (Windows NT 5.2; WOW64; rv:21.0) Gecko\/20100101 Firefox\/21.0", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Opera\/9.80 (Windows NT 5.2; WOW64) Presto\/2.12.388 Version\/12.14", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko\/20100101 Firefox\/19.0", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (X11; FreeBSD amd64; rv:14.0) Gecko\/20100101 Firefox\/14.0.1", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Win64; x64; Trident\/6.0; Touch; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Tablet PC 2.0; MASMJS)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident\/6.0; MANMJS)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident\/6.0; MASMJS)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident\/6.0; Touch; MASMJS)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Opera\/9.80 (Windows NT 6.2; WOW64; MRA 8.0 (build 5784)) Presto\/2.12.388 Version\/12.11", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident\/6.0)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (Windows NT 6.3; Trident\/7.0; rv 11.0) like Gecko", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (Windows NT 6.3; WOW64; Trident\/7.0; Touch; rv:11.0) like Gecko", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Mozilla\/5.0 (Unknown; Linux armv7l) AppleWebKit\/537.1+ (KHTML, like Gecko) Safari\/537.1+ HbbTV\/1.1.1 ( ;LGE ;NetCast 4.0 ;03.20.30 ;1.0M ;)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "HbbTV\/1.1.1 (;Panasonic;VIERA 2012;1.261;0071-3103 2000-0000;)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Other", + "user_agent": "Opera\/9.80 (Linux armv7l; HbbTV\/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto\/2.12.362 Version\/12.11", + "mobile": false, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Linux; U; Jolla; Sailfish; Mobile; rv:20.0) Gecko\/20.0 Firefox\/20.0 Sailfish Browser\/1.0 like Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Mobile; rv:26.0) Gecko\/26.0 Firefox\/26.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Tablet; rv:26.0) Gecko\/26.0 Firefox\/26.0", + "mobile": true, + "tablet": true + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; CT1020W Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; M6pro Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Generic", + "user_agent": "MobileSafari\/9537.53 CFNetwork\/672.1.13 Darwin\/13.1.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Appcelerator Titanium\/3.2.2.GA (iPod touch\/6.1.6; iPhone OS; en_US;)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Opera Coast\/3.0.3.78307 CFNetwork\/672.1.15 Darwin\/14.0.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; ALUMIUM10 Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.36", + "mobile": true, + "tablet": true + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.1; en-us; JY-G3 Build\/JOP40D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; hu-hu; M758A Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; EVOTAB Build\/IMM76I) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Generic", + "user_agent": "Java\/1.6.0_22", + "mobile": false, + "tablet": false, + "version": { + "Java": "1.6.0_22" + } + }, + { + "vendor": "Generic", + "user_agent": "Opera\/9.80 (Series 60; Opera Mini\/6.5.29260\/29.3417; U; ru) Presto\/2.8.119 Version\/11.10", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Opera\/9.80 (Android; Opera Mini\/6.5.27452\/29.3417; U; ru) Presto\/2.8.119 Version\/11.10", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Opera\/9.80 (iPhone; Opera Mini\/7.1.32694\/27.1407; U; en) Presto\/2.8.119 Version\/11.10", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/537.17 (KHTML, like Gecko) Chrome\/24.0.1312.60 Safari\/537.17 OPR\/14.0.1025.52315", + "mobile": false, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit\/533.17.9 (KHTML, like Gecko) Version\/5.0.2 Mobile\/8H7 Safari\/6533.18.5", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Opera\/9.80 (Android 2.3.7; Linux; Opera Mobi\/46154) Presto\/2.11.355 Version\/12.10", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (iPad; CPU OS 6_1 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Version\/6.0 Mobile\/10B141 Safari\/8536.25", + "mobile": true, + "tablet": true + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; sdk Build\/MASTER) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2; en-us; sdk Build\/JB_MR1) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Android; Mobile; rv:18.0) Gecko\/18.0 Firefox\/18.0", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Windows NT 6.1) AppleWebKit\/535.12 (KHTML, like Gecko) Maxthon\/3.0 Chrome\/18.0.966.0 Safari\/535.12", + "mobile": false, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Opera\/9.80 (Windows NT 5.1; U; Edition Yx; ru) Presto\/2.10.289 Version\/12.02", + "mobile": false, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Windows Phone 6.5.3.5)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "PalmCentro\/v0001 Mozilla\/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource\/Palm-D061; Blazer\/4.5) 16;320x320", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Microsoft; XDeviceEmulator)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; MAL; N880E; China Telecom)", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Opera\/9.80 (Series 60; Opera Mini\/7.0.29482\/28.2859; U; ru) Presto\/2.8.119 Version\/11.10", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Opera\/9.80 (S60; SymbOS; Opera Mobi\/SYB-1202242143; U; en-GB) Presto\/2.10.254 Version\/12.00", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-au; 97D Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Generic", + "user_agent": "Opera\/9.80 (Android; Opera Mini\/7.0.29952\/28.2647; U; ru) Presto\/2.8.119 Version\/11.10", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Opera\/9.80 (Android; Opera Mini\/6.1.25375\/28.2555; U; en) Presto\/2.8.119 Version\/11.10", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Opera\/9.80 (Mac OS X; Opera Tablet\/35779; U; en) Presto\/2.10.254 Version\/12.00", + "mobile": true, + "tablet": true + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Android; Tablet; rv:10.0.4) Gecko\/10.0.4 Firefox\/10.0.4 Fennec\/10.0.4", + "mobile": true, + "tablet": true + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Android; Tablet; rv:18.0) Gecko\/18.0 Firefox\/18.0", + "mobile": true, + "tablet": true + }, + { + "vendor": "Generic", + "user_agent": "Opera\/9.80 (Linux armv7l; Maemo; Opera Mobi\/14; U; en) Presto\/2.9.201 Version\/11.50", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Opera\/9.80 (Android 2.2.1; Linux; Opera Mobi\/ADR-1207201819; U; en) Presto\/2.10.254 Version\/12.00", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; sdk Build\/JRO03E) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", + "mobile": true, + "tablet": false + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; Endeavour 1010 Build\/ONDA_MID) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; de-de; Tablet-PC-4 Build\/ICS.g08refem618.20121102) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Generic", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; Tagi Tab S10 Build\/8089) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Bot", + "user_agent": "Mozilla\/5.0 (compatible; Googlebot\/2.1; +http:\/\/www.google.com\/bot.html)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Bot", + "user_agent": "grub-client-1.5.3; (grub-client-1.5.3; Crawl your own stuff with http:\/\/grub.org)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Bot", + "user_agent": "Googlebot-Image\/1.0", + "mobile": false, + "tablet": false + }, + { + "vendor": "Bot", + "user_agent": "Python-urllib\/2.5", + "mobile": false, + "tablet": false + }, + { + "vendor": "Bot", + "user_agent": "facebookexternalhit\/1.0 (+http:\/\/www.facebook.com\/externalhit_uatext.php)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Bot", + "user_agent": "AdsBot-Google (+http:\/\/www.google.com\/adsbot.html)", + "mobile": false, + "tablet": false + }, + { + "vendor": "Bot", + "user_agent": "AdsBot-Google-Mobile (+http:\/\/www.google.com\/mobile\/adsbot.html) Mozilla (iPhone; U; CPU iPhone OS 3 0 like Mac OS X) AppleWebKit (KHTML, like Gecko) Mobile Safari", + "mobile": true, + "tablet": false + }, + { + "vendor": "Bot", + "user_agent": "Mozilla\/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit\/534.16 (KHTML, like Gecko, Google Keyword Suggestion) Chrome\/10.0.648.127 Safari\/534.16", + "mobile": false, + "tablet": false + }, + { + "vendor": "Bot", + "user_agent": "Facebot", + "mobile": false, + "tablet": false + }, + { + "vendor": "Vodafone", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2; hu-hu; SmartTab10-MSM8260-V02d-Dec022011-Vodafone-HU) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0", + "mobile": true, + "tablet": true + }, + { + "vendor": "Vodafone", + "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; SmartTabII10 Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", + "mobile": true, + "tablet": true + }, + { + "vendor": "Vodafone", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; fr-fr; SmartTAB 1002 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + }, + { + "vendor": "Vodafone", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; de-de, SmartTabII7 Build\/A2107A_A404_107_055_130124_VODA) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", + "mobile": true, + "tablet": true + } + ] +} \ No newline at end of file From 2cf36d157fb6fee1fa4829f5afbbd70beea996dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 7 Dec 2015 14:15:00 +0100 Subject: [PATCH 161/206] FIX #3953 Don't round supplier price The price is already rounded when inserted on the product page. It's also rounded at display. There's no need to round it here. Rounding it leads to serious calculation errors. --- htdocs/core/tpl/objectline_create.tpl.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index d7949fa1d52..25668b2876d 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -594,7 +594,7 @@ jQuery(document).ready(function() { /* Define default price at loading */ var defaultprice = $("#fournprice_predef").find('option:selected').attr("price"); - $("#buying_price").val(Math.round(defaultprice,global->MAIN_MAX_DECIMALS_UNIT ? $conf->global->MAIN_MAX_DECIMALS_UNIT : 5); ?>)); + $("#buying_price").val(defaultprice); $("#fournprice_predef").change(function() { console.log("change on fournprice_predef"); From 3f9efc537b09f142baeb249ea4e1f8a6c88c9f54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 7 Dec 2015 14:15:00 +0100 Subject: [PATCH 162/206] FIX #3953 Don't round supplier price The price is already rounded when inserted on the product page. It's also rounded at display. There's no need to round it here. Rounding it leads to serious calculation errors. --- htdocs/core/tpl/objectline_create.tpl.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index fd5a81240ef..7244711bb43 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -554,7 +554,7 @@ jQuery(document).ready(function() { /* Define default price at loading */ var defaultprice = $("#fournprice_predef").find('option:selected').attr("price"); - $("#buying_price").val(parseFloat(defaultprice).toFixed(global->MAIN_MAX_DECIMALS_UNIT ? $conf->global->MAIN_MAX_DECIMALS_UNIT : 5); ?>)); + $("#buying_price").val(defaultprice); $("#fournprice_predef").change(function() { console.log("change on fournprice_predef"); From 01c6728aa9bea51db6ed7e3dca6ff16e05f3364d Mon Sep 17 00:00:00 2001 From: philippe grand Date: Tue, 8 Dec 2015 11:35:08 +0100 Subject: [PATCH 163/206] [Qual] Uniformize code --- htdocs/exports/export.php | 16 ++-- htdocs/externalsite/admin/externalsite.php | 4 +- htdocs/fichinter/card.php | 12 +-- htdocs/fichinter/contact.php | 12 +-- htdocs/fourn/commande/card.php | 86 +++++++++++----------- htdocs/fourn/commande/contact.php | 14 ++-- htdocs/fourn/commande/dispatch.php | 6 +- 7 files changed, 75 insertions(+), 75 deletions(-) diff --git a/htdocs/exports/export.php b/htdocs/exports/export.php index e0870411003..d7dbc008a27 100644 --- a/htdocs/exports/export.php +++ b/htdocs/exports/export.php @@ -177,7 +177,7 @@ if ($action=='selectfield') //print_r($array_selected); $_SESSION["export_selected_fields"]=$array_selected; - setEventMessage($warnings, 'warnings'); + setEventMessages($warnings, null, 'warnings'); } } @@ -243,12 +243,12 @@ if ($action == 'builddoc') $result=$objexport->build_file($user, GETPOST('model','alpha'), $datatoexport, $array_selected, $array_filtervalue); if ($result < 0) { - setEventMessage($objexport->error, 'errors'); + setEventMessages($objexport->error, $objexport->errors, 'errors'); $sqlusedforexport=$objexport->sqlusedforexport; } else { - setEventMessage($langs->trans("FileSuccessfullyBuilt")); + setEventMessages($langs->trans("FileSuccessfullyBuilt"), null, 'mesgs'); $sqlusedforexport=$objexport->sqlusedforexport; } } @@ -259,8 +259,8 @@ if ($step == 5 && $action == 'confirm_deletefile' && $confirm == 'yes') $file = $upload_dir . "/" . GETPOST('file'); // Do not use urldecode here ($_GET and $_REQUEST are already decoded by PHP). $ret=dol_delete_file($file); - if ($ret) setEventMessage($langs->trans("FileWasRemoved", GETPOST('file'))); - else setEventMessage($langs->trans("ErrorFailToDeleteFile", GETPOST('file')), 'errors'); + if ($ret) setEventMessage($langs->trans("FileWasRemoved", GETPOST('file')), null, 'mesgs'); + else setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('file')), null, 'errors'); header('Location: '.$_SERVER["PHP_SELF"].'?step='.$step.'&datatoexport='.$datatoexport); exit; } @@ -307,15 +307,15 @@ if ($action == 'add_export_model') $result = $objexport->create($user); if ($result >= 0) { - setEventMessage($langs->trans("ExportModelSaved",$objexport->model_name)); + setEventMessages($langs->trans("ExportModelSaved",$objexport->model_name), null, 'mesgs'); } else { $langs->load("errors"); if ($objexport->errno == 'DB_ERROR_RECORD_ALREADY_EXISTS') - setEventMessage($langs->trans("ErrorExportDuplicateProfil"), 'errors'); + setEventMessages($langs->trans("ErrorExportDuplicateProfil"), null, 'errors'); else - setEventMessage($objexport->error, 'errors'); + setEventMessages($objexport->error, $objexport->errors, 'errors'); } } else diff --git a/htdocs/externalsite/admin/externalsite.php b/htdocs/externalsite/admin/externalsite.php index 90fb5aff9f0..bd0449dc028 100644 --- a/htdocs/externalsite/admin/externalsite.php +++ b/htdocs/externalsite/admin/externalsite.php @@ -59,12 +59,12 @@ if ($action == 'update') if ($i >= 2) { $db->commit(); - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { $db->rollback(); - setEventMessage($db->lasterror(), 'errors'); + setEventMessages($db->lasterror(), null, 'errors'); } } diff --git a/htdocs/fichinter/card.php b/htdocs/fichinter/card.php index 403f1411dc8..3fd45013ab5 100644 --- a/htdocs/fichinter/card.php +++ b/htdocs/fichinter/card.php @@ -386,7 +386,7 @@ if (empty($reshook)) $result=$object->update($user); if ($result<0) { - setEventMessage($object->error,'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } @@ -429,8 +429,8 @@ if (empty($reshook)) $upload_dir = $conf->ficheinter->dir_output; $file = $upload_dir . '/' . GETPOST('file'); $ret=dol_delete_file($file,0,0,0,$object); - if ($ret) setEventMessage($langs->trans("FileWasRemoved", GETPOST('urlfile'))); - else setEventMessage($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), 'errors'); + if ($ret) setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile')), null, 'mesgs'); + else setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), null, 'errors'); } // Set into a project @@ -451,7 +451,7 @@ if (empty($reshook)) { $result=$object->delete($user); if ($result<0) { - setEventMessage($object->error,'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } header('Location: '.DOL_URL_ROOT.'/fichinter/list.php?leftmenu=ficheinter'); @@ -802,7 +802,7 @@ if (empty($reshook)) if ($result) { $mesg=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($from,2),$mailfile->getValidAddress($sendto,2)); - setEventMessage($mesg); + setEventMessages($mesg, null, 'mesgs'); $error=0; // Initialisation donnees @@ -1216,7 +1216,7 @@ else if ($id > 0 || ! empty($ref)) if (empty($numref)) { $error++; - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } else diff --git a/htdocs/fichinter/contact.php b/htdocs/fichinter/contact.php index 854428a5ccf..b92c1442d14 100644 --- a/htdocs/fichinter/contact.php +++ b/htdocs/fichinter/contact.php @@ -46,7 +46,7 @@ $result = $object->fetch($id,$ref); /* - * Ajout d'un nouveau contact + * Adding a new contact */ if ($action == 'addcontact' && $user->rights->ficheinter->creer) @@ -71,17 +71,17 @@ if ($action == 'addcontact' && $user->rights->ficheinter->creer) $mesg = $object->error; } - setEventMessage($mesg, 'errors'); + setEventMessages($mesg, null, 'errors'); } } -// bascule du statut d'un contact +// Toggle the status of a contact else if ($action == 'swapstatut' && $user->rights->ficheinter->creer) { $result=$object->swapContactStatus(GETPOST('ligne','int')); } -// Efface un contact +// Deletes a contact else if ($action == 'deletecontact' && $user->rights->ficheinter->creer) { $result = $object->delete_contact(GETPOST('lineid','int')); @@ -121,8 +121,8 @@ if ($id > 0 || ! empty($ref)) /* - * Fiche intervention synthese pour rappel - */ + * Fiche intervention synthese pour rappel + */ print ''; $linkback = ''.$langs->trans("BackToList").''; diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index baa11ed9c07..52ecc6d3682 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -4,7 +4,7 @@ * Copyright (C) 2005 Eric Seigne * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2010-2015 Juanjo Menent - * Copyright (C) 2011 Philippe Grand + * Copyright (C) 2011-2015 Philippe Grand * Copyright (C) 2012 Marcos García * Copyright (C) 2013 Florian Henry * Copyright (C) 2014 Ion Agorria @@ -153,14 +153,14 @@ if (empty($reshook)) if ($result < 0) setEventMessages($object->error, $object->errors, 'errors'); } - // conditions de reglement + // payment conditions if ($action == 'setconditions' && $user->rights->fournisseur->commande->creer) { $result=$object->setPaymentTerms(GETPOST('cond_reglement_id','int')); if ($result < 0) setEventMessages($object->error, $object->errors, 'errors'); } - // mode de reglement + // payment mode if ($action == 'setmode' && $user->rights->fournisseur->commande->creer) { $result = $object->setPaymentMethods(GETPOST('mode_reglement_id','int')); @@ -174,7 +174,7 @@ if (empty($reshook)) if ($result < 0) setEventMessages($object->error, $object->errors, 'errors'); } - // date de livraison + // date of delivery if ($action == 'setdate_livraison' && $user->rights->fournisseur->commande->creer) { $result=$object->set_date_livraison($user,$datelivraison); @@ -248,7 +248,7 @@ if (empty($reshook)) { $ret=$object->classifyBilled(); if ($ret < 0) { - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } @@ -295,27 +295,27 @@ if (empty($reshook)) if (GETPOST('prod_entry_mode')=='free' && GETPOST('price_ht') < 0 && $qty < 0) { - setEventMessage($langs->trans('ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv('UnitPrice'), $langs->transnoentitiesnoconv('Qty')), 'errors'); + setEventMessages($langs->trans('ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv('UnitPrice'), $langs->transnoentitiesnoconv('Qty')), null, 'errors'); $error++; } if (GETPOST('prod_entry_mode')=='free' && ! GETPOST('idprodfournprice') && GETPOST('type') < 0) { - setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Type')), 'errors'); + setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Type')), null, 'errors'); $error++; } if (GETPOST('prod_entry_mode')=='free' && GETPOST('price_ht')==='' && GETPOST('price_ttc')==='') // Unit price can be 0 but not '' { - setEventMessage($langs->trans($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('UnitPrice'))), 'errors'); + setEventMessages($langs->trans($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('UnitPrice'))), null, 'errors'); $error++; } if (GETPOST('prod_entry_mode')=='free' && ! GETPOST('dp_desc')) { - setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Description')), 'errors'); + setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Description')), null, 'errors'); $error++; } if (! GETPOST('qty')) { - setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Qty')), 'errors'); + setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Qty')), null, 'errors'); $error++; } @@ -384,7 +384,7 @@ if (empty($reshook)) // Quantity too low $error++; $langs->load("errors"); - setEventMessage($langs->trans("ErrorQtyTooLowForThisSupplier"), 'errors'); + setEventMessages($langs->trans("ErrorQtyTooLowForThisSupplier"), null, 'errors'); } } else if((GETPOST('price_ht')!=='' || GETPOST('price_ttc')!=='') && empty($error)) @@ -481,7 +481,7 @@ if (empty($reshook)) } /* - * Mise a jour d'une ligne dans la commande + * Updating a line in the order */ if ($action == 'updateline' && $user->rights->fournisseur->commande->creer && ! GETPOST('cancel')) { @@ -675,7 +675,7 @@ if (empty($reshook)) if (! $idwarehouse || $idwarehouse == -1) { $error++; - setEventMessage($langs->trans('ErrorFieldRequired',$langs->transnoentitiesnoconv("Warehouse")), 'errors'); + setEventMessages($langs->trans('ErrorFieldRequired',$langs->transnoentitiesnoconv("Warehouse")), null, 'errors'); $action=''; } } @@ -764,7 +764,7 @@ if (empty($reshook)) { if (1==0 && ! GETPOST('clone_content') && ! GETPOST('clone_receivers')) { - setEventMessage($langs->trans("NoCloneOptionsSpecified"), 'errors'); + setEventMessages($langs->trans("NoCloneOptionsSpecified"), null, 'errors'); } else { @@ -857,8 +857,8 @@ if (empty($reshook)) $upload_dir = $conf->fournisseur->commande->dir_output; $file = $upload_dir . '/' . GETPOST('file'); $ret=dol_delete_file($file,0,0,0,$object); - if ($ret) setEventMessage($langs->trans("FileWasRemoved", GETPOST('urlfile'))); - else setEventMessage($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), 'errors'); + if ($ret) setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile')), null, 'mesgs'); + else setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), null, 'errors'); } if ($action == 'update_extras') @@ -910,7 +910,7 @@ if (empty($reshook)) if ($socid <1) { - setEventMessage($langs->trans('ErrorFieldRequired',$langs->transnoentities('Supplier')), 'errors'); + setEventMessages($langs->trans('ErrorFieldRequired',$langs->transnoentities('Supplier')), null, 'errors'); $action='create'; $error++; } @@ -1190,7 +1190,7 @@ if (empty($reshook)) $mailfile = new CMailFile($subject,$sendto,$from,$message,$filepath,$mimetype,$filename,$sendtocc,'',$deliveryreceipt,-1); if ($mailfile->error) { - setEventMessage($mailfile->error, 'errors'); + setEventMessages($mailfile->error, $mailfile->errors, 'errors'); } else { @@ -1198,7 +1198,7 @@ if (empty($reshook)) if ($result) { $mesg=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($from,2),$mailfile->getValidAddress($sendto,2)); // Must not contain " - setEventMessage($mesg); + setEventMessages($mesg, null, 'mesgs'); $error=0; @@ -1219,7 +1219,7 @@ if (empty($reshook)) if ($error) { - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } else { @@ -1242,7 +1242,7 @@ if (empty($reshook)) $mesg = 'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS'; } - setEventMessage($mesg, 'errors'); + setEventMessages($mesg, null, 'errors'); } } /* } @@ -1257,14 +1257,14 @@ if (empty($reshook)) else { $langs->load("errors"); - setEventMessage($langs->trans('ErrorCantReadFile',$file), 'errors'); + setEventMessages($langs->trans('ErrorCantReadFile',$file), null, 'errors'); dol_syslog('Failed to read file: '.$file); } } else { $langs->load("other"); - setEventMessage($langs->trans('ErrorFailedToReadEntity',$langs->trans("Invoice")), 'errors'); + setEventMessages($langs->trans('ErrorFailedToReadEntity',$langs->trans("Invoice")), null, 'errors'); dol_syslog('Impossible de lire les donnees de la facture. Le fichier facture n\'a peut-etre pas ete genere.'); } } @@ -1290,11 +1290,11 @@ if (empty($reshook)) //Is sync supplier web services module activated? and everything filled? if (empty($conf->syncsupplierwebservices->enabled)) { - setEventMessage($langs->trans("WarningModuleNotActive",$langs->transnoentities("Module2650Name"))); + setEventMessages($langs->trans("WarningModuleNotActive",$langs->transnoentities("Module2650Name")), null, 'mesgs'); } else if (empty($ws_url) || empty($ws_key)) { - setEventMessage($langs->trans("ErrorWebServicesFieldsRequired"), 'errors'); + setEventMessages($langs->trans("ErrorWebServicesFieldsRequired"), null, 'errors'); } else if (empty($ws_user) || empty($ws_password) || empty($ws_thirdparty)) { - setEventMessage($langs->trans("ErrorFieldsRequired"), 'errors'); + setEventMessages($langs->trans("ErrorFieldsRequired"),null, 'errors'); } else { @@ -1349,15 +1349,15 @@ if (empty($reshook)) if (empty($result_order["result"]["result_code"])) //No result, check error str { - setEventMessage($langs->trans("SOAPError")." '".$soapclient_order->error_str."'", 'errors'); + setEventMessages($langs->trans("SOAPError")." '".$soapclient_order->error_str."'", null, 'errors'); } else if ($result_order["result"]["result_code"] != "OK") //Something went wrong { - setEventMessage($langs->trans("SOAPError")." '".$result_order["result"]["result_code"]."' - '".$result_order["result"]["result_label"]."'", 'errors'); + setEventMessages($langs->trans("SOAPError")." '".$result_order["result"]["result_code"]."' - '".$result_order["result"]["result_label"]."'", null, 'errors'); } else { - setEventMessage($langs->trans("RemoteOrderRef")." ".$result_order["ref"], 'mesgs'); + setEventMessages($langs->trans("RemoteOrderRef")." ".$result_order["ref"], null, 'mesgs'); } } } @@ -1382,11 +1382,11 @@ if (empty($reshook)) if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') { $langs->load("errors"); - setEventMessage($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), 'errors'); + setEventMessages($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), null, 'errors'); } else { - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } @@ -2443,11 +2443,11 @@ elseif (! empty($object->id)) //Is everything filled? if (empty($ws_url) || empty($ws_key)) { - setEventMessage($langs->trans("ErrorWebServicesFieldsRequired"), 'errors'); + setEventMessages($langs->trans("ErrorWebServicesFieldsRequired"), null, 'errors'); $mode = "init"; $error_occurred = true; //Don't allow to set the user/pass if thirdparty fields are not filled } else if ($mode != "init" && (empty($ws_user) || empty($ws_password))) { - setEventMessage($langs->trans("ErrorFieldsRequired"), 'errors'); + setEventMessages($langs->trans("ErrorFieldsRequired"), null, 'errors'); $mode = "init"; } @@ -2511,7 +2511,7 @@ elseif (! empty($object->id)) $ws_thirdparty = $result_user["user"]["fk_thirdparty"]; if (empty($ws_thirdparty)) { - setEventMessage($langs->trans("RemoteUserMissingAssociatedSoc"), 'errors'); + setEventMessages($langs->trans("RemoteUserMissingAssociatedSoc"), null, 'errors'); $error_occurred = true; } else @@ -2534,7 +2534,7 @@ elseif (! empty($object->id)) $result_product = $soapclient_product->call("getProductOrService", $ws_parameters, $ws_ns, ''); if (!$result_product) { - setEventMessage($line_id.$langs->trans("SOAPError")." ".$soapclient_product->error_str." - ".$soapclient_product->response, 'errors'); + setEventMessages($line_id.$langs->trans("SOAPError")." ".$soapclient_product->error_str." - ".$soapclient_product->response, null, 'errors'); $error_occurred = true; break; } @@ -2543,17 +2543,17 @@ elseif (! empty($object->id)) $status_code = $result_product["result"]["result_code"]; if (empty($status_code)) //No result, check error str { - setEventMessage($langs->trans("SOAPError")." '".$soapclient_order->error_str."'", 'errors'); + setEventMessages($langs->trans("SOAPError")." '".$soapclient_order->error_str."'", null, 'errors'); } else if ($status_code != "OK") //Something went wrong { if ($status_code == "NOT_FOUND") { - setEventMessage($line_id.$langs->trans("SupplierMissingRef")." '".$ref_supplier."'", 'warnings'); + setEventMessages($line_id.$langs->trans("SupplierMissingRef")." '".$ref_supplier."'", null, 'warnings'); } else { - setEventMessage($line_id.$langs->trans("ResponseNonOK")." '".$status_code."' - '".$result_product["result"]["result_label"]."'", 'errors'); + setEventMessages($line_id.$langs->trans("ResponseNonOK")." '".$status_code."' - '".$result_product["result"]["result_label"]."'", null, 'errors'); $error_occurred = true; break; } @@ -2578,12 +2578,12 @@ elseif (! empty($object->id)) } if ($local_price != NULL && $local_price != $supplier_price) { - setEventMessage($line_id.$langs->trans("RemotePriceMismatch")." ".$supplier_price." - ".$local_price, 'warnings'); + setEventMessages($line_id.$langs->trans("RemotePriceMismatch")." ".$supplier_price." - ".$local_price, null, 'warnings'); } // Check if is in sale if (empty($result_product["product"]["status_tosell"])) { - setEventMessage($line_id.$langs->trans("ProductStatusNotOnSellShort")." '".$ref_supplier."'", 'warnings'); + setEventMessages($line_id.$langs->trans("ProductStatusNotOnSellShort")." '".$ref_supplier."'", null, 'warnings'); } } } @@ -2591,17 +2591,17 @@ elseif (! empty($object->id)) } elseif ($user_status_code == "PERMISSION_DENIED") { - setEventMessage($langs->trans("RemoteUserNotPermission"), 'errors'); + setEventMessages($langs->trans("RemoteUserNotPermission"), null, 'errors'); $error_occurred = true; } elseif ($user_status_code == "BAD_CREDENTIALS") { - setEventMessage($langs->trans("RemoteUserBadCredentials"), 'errors'); + setEventMessages($langs->trans("RemoteUserBadCredentials"), null, 'errors'); $error_occurred = true; } else { - setEventMessage($langs->trans("ResponseNonOK")." '".$user_status_code."'", 'errors'); + setEventMessages($langs->trans("ResponseNonOK")." '".$user_status_code."'", null, 'errors'); $error_occurred = true; } diff --git a/htdocs/fourn/commande/contact.php b/htdocs/fourn/commande/contact.php index b8eabb9be6c..8ced1e9844c 100644 --- a/htdocs/fourn/commande/contact.php +++ b/htdocs/fourn/commande/contact.php @@ -46,7 +46,7 @@ $object = new CommandeFournisseur($db); /* - * Ajout d'un nouveau contact + * Add a new contact */ if ($action == 'addcontact' && $user->rights->fournisseur->commande->creer) @@ -69,16 +69,16 @@ if ($action == 'addcontact' && $user->rights->fournisseur->commande->creer) if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') { $langs->load("errors"); - setEventMessage($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), 'errors'); + setEventMessages($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), null, 'errors'); } else { - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } -// bascule du statut d'un contact +// Toggle the status of a contact else if ($action == 'swapstatut' && $user->rights->fournisseur->commande->creer) { if ($object->fetch($id)) @@ -91,7 +91,7 @@ else if ($action == 'swapstatut' && $user->rights->fournisseur->commande->creer) } } -// Efface un contact +// Deleting a contact else if ($action == 'deletecontact' && $user->rights->fournisseur->commande->creer) { $object->fetch($id); @@ -155,7 +155,7 @@ if ($id > 0 || ! empty($ref)) print ''; print ''; - // Fournisseur + // Supplier print '"; print ''; print ''; @@ -172,7 +172,7 @@ if ($id > 0 || ! empty($ref)) } else { - // Contrat non trouv + // Contact not found print "ErrorRecordNotFound"; } } diff --git a/htdocs/fourn/commande/dispatch.php b/htdocs/fourn/commande/dispatch.php index 57ee36eb8a3..fd44b987f94 100644 --- a/htdocs/fourn/commande/dispatch.php +++ b/htdocs/fourn/commande/dispatch.php @@ -148,7 +148,7 @@ if ($action == 'dispatch' && $user->rights->fournisseur->commande->receptionner) { dol_syslog('No dispatch for line '.$key.' as no warehouse choosed'); $text = $langs->transnoentities('Warehouse').', '.$langs->transnoentities('Line').' ' .($numline); - setEventMessage($langs->trans('ErrorFieldRequired',$text), 'errors'); + setEventMessages($langs->trans('ErrorFieldRequired',$text), null, 'errors'); $error++; } @@ -187,7 +187,7 @@ if ($action == 'dispatch' && $user->rights->fournisseur->commande->receptionner) { dol_syslog('No dispatch for line '.$key.' as no warehouse choosed'); $text = $langs->transnoentities('Warehouse').', '.$langs->transnoentities('Line').' ' .($numline).'-'.($reg[1]+1); - setEventMessage($langs->trans('ErrorFieldRequired',$text), 'errors'); + setEventMessages($langs->trans('ErrorFieldRequired',$text), null, 'errors'); $error++; } @@ -195,7 +195,7 @@ if ($action == 'dispatch' && $user->rights->fournisseur->commande->receptionner) { dol_syslog('No dispatch for line '.$key.' as serial/eat-by/sellby date are not set'); $text = $langs->transnoentities('atleast1batchfield').', '.$langs->transnoentities('Line').' ' .($numline).'-'.($reg[1]+1); - setEventMessage($langs->trans('ErrorFieldRequired',$text), 'errors'); + setEventMessages($langs->trans('ErrorFieldRequired',$text), null, 'errors'); $error++; } From 238f9770025da83d3139cc73660d8f00840464c4 Mon Sep 17 00:00:00 2001 From: Ion Agorria Date: Tue, 8 Dec 2015 15:45:24 +0100 Subject: [PATCH 164/206] JS error preventing hiding of dates at object line The "if (CKEDITOR)" gives "ReferenceError: CKEDITOR is not defined" at JS console causing the next code to don't execute, is this code obsolete? --- htdocs/core/tpl/objectline_create.tpl.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index d7949fa1d52..a2f4ebd4d69 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -517,12 +517,6 @@ jQuery(document).ready(function() { { /* focus work on a standard textarea but not if field was replaced with CKEDITOR */ jQuery('#dp_desc').focus(); - /* focus if CKEDITOR */ - if (CKEDITOR) - { - var editor = CKEDITOR.instances['dp_desc']; - if (editor) { editor.focus(); } - } } if (jQuery('#select_type').val() == '0') jQuery('#trlinefordates').hide(); else jQuery('#trlinefordates').show(); From 898f637457dbdb7f023e002b6f1b03c83a12e3db Mon Sep 17 00:00:00 2001 From: BENKE Charlie Date: Tue, 8 Dec 2015 18:02:25 +0100 Subject: [PATCH 165/206] Update fichinter.php --- htdocs/admin/fichinter.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/admin/fichinter.php b/htdocs/admin/fichinter.php index 50d2bf3cead..fd34d01f620 100644 --- a/htdocs/admin/fichinter.php +++ b/htdocs/admin/fichinter.php @@ -578,4 +578,3 @@ print '
      '; llxFooter(); $db->close(); - From 4885c64ab3ff518f2878085c669ff786614ee0a7 Mon Sep 17 00:00:00 2001 From: Andreas Pachler Date: Wed, 9 Dec 2015 09:32:21 +0100 Subject: [PATCH 166/206] added social charges for Austria --- htdocs/install/mysql/data/llx_c_chargesociales.sql | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/htdocs/install/mysql/data/llx_c_chargesociales.sql b/htdocs/install/mysql/data/llx_c_chargesociales.sql index 892e51d0fba..d598f6fef60 100644 --- a/htdocs/install/mysql/data/llx_c_chargesociales.sql +++ b/htdocs/install/mysql/data/llx_c_chargesociales.sql @@ -55,3 +55,15 @@ insert into llx_c_chargesociales (id, libelle, deductible, active, code, fk_pays insert into llx_c_chargesociales (id, libelle, deductible, active, code, fk_pays) values (220, 'Prime existence', 1,1,'TAXBEPRIEXI' ,'2'); insert into llx_c_chargesociales (id, libelle, deductible, active, code, fk_pays) values (230, 'Precompte immobilier', 1,1,'TAXBEPREIMMO','2'); +-- +-- Austria +-- +insert into llx_c_chargesociales (id, libelle, deductible, active, code, fk_pays) values (4101, 'Krankenversicherung', 1,1,'TAXATKV' ,'41'); +insert into llx_c_chargesociales (id, libelle, deductible, active, code, fk_pays) values (4102, 'Unfallversicherung', 1,1,'TAXATUV' ,'41'); +insert into llx_c_chargesociales (id, libelle, deductible, active, code, fk_pays) values (4103, 'Pensionsversicherung', 1,1,'TAXATPV' ,'41'); +insert into llx_c_chargesociales (id, libelle, deductible, active, code, fk_pays) values (4104, 'Arbeitslosenversicherung', 1,1,'TAXATAV' ,'41'); +insert into llx_c_chargesociales (id, libelle, deductible, active, code, fk_pays) values (4105, 'Insolvenzentgeltsicherungsfond', 1,1,'TAXATIESG' ,'41'); +insert into llx_c_chargesociales (id, libelle, deductible, active, code, fk_pays) values (4106, 'Wohnbauförderung', 1,1,'TAXATWF' ,'41'); +insert into llx_c_chargesociales (id, libelle, deductible, active, code, fk_pays) values (4107, 'Arbeiterkammerumlage', 1,1,'TAXATAK' ,'41'); +insert into llx_c_chargesociales (id, libelle, deductible, active, code, fk_pays) values (4108, 'Mitarbeitervorsorgekasse', 1,1,'TAXATMVK' ,'41'); +insert into llx_c_chargesociales (id, libelle, deductible, active, code, fk_pays) values (4109, 'Familienlastenausgleichsfond', 1,1,'TAXATFLAF' ,'41'); From ea1a81f5f4dc8b02d47a8d0bf67ce594f6a44724 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Wed, 9 Dec 2015 11:53:38 +0100 Subject: [PATCH 167/206] FIX : Comptability when multiple account charts --- htdocs/accountancy/customer/list.php | 16 +++++++++++----- htdocs/accountancy/supplier/list.php | 4 ++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php index 820596de166..4800737528d 100644 --- a/htdocs/accountancy/customer/list.php +++ b/htdocs/accountancy/customer/list.php @@ -87,10 +87,10 @@ if (! $user->rights->accounting->ventilation->dispatch) accessforbidden(); $formventilation = new FormVentilation($db); - $accounting = new AccountingAccount($db); -$aarowid_s = $accounting->fetch('', ACCOUNTING_SERVICE_SOLD_ACCOUNT); -$aarowid_p = $accounting->fetch('', ACCOUNTING_PRODUCT_SOLD_ACCOUNT); +$aarowid_s = $accounting->fetch('', $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT,1); +$aarowid_p = $accounting->fetch('',$conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT,1); + // Purge search criteria if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) { @@ -278,6 +278,8 @@ if ($result) { $code_sell_p_notset = ''; $objp->aarowid_suggest = $objp->aarowid; + + if (! empty($objp->code_sell)) { $objp->code_sell_p = $objp->code_sell; } else { @@ -290,12 +292,14 @@ if ($result) { } if ($objp->type_l == 1) { $objp->code_sell_l = (! empty($conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); - if ($objp->aarowid == '') + if ($objp->aarowid == '') { $objp->aarowid_suggest = $aarowid_s; + } } elseif ($objp->type_l == 0) { $objp->code_sell_l = (! empty($conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); - if ($objp->aarowid == '') + if ($objp->aarowid == '') { $objp->aarowid_suggest = $aarowid_p; + } } if ($objp->code_sell_l != $objp->code_sell_p) $code_sell_p_l_differ = 'color:red'; @@ -311,10 +315,12 @@ if ($result) { $product_static->id = $objp->product_id; $product_static->type = $objp->type; print '
      '; print ''; diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index 891d8b1439e..c94c8612535 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -94,8 +94,8 @@ $formventilation = new FormVentilation($db); $accounting = new AccountingAccount($db); // TODO: we should need to check if result is a really exist accountaccount rowid..... -$aarowid_s = $accounting->fetch('', ACCOUNTING_SERVICE_BUY_ACCOUNT); -$aarowid_p = $accounting->fetch('', ACCOUNTING_PRODUCT_BUY_ACCOUNT); +$aarowid_s = $accounting->fetch('', $conf->global->ACCOUNTING_SERVICE_BUY_ACCOUNT,1); +$aarowid_p = $accounting->fetch('', $conf->global->ACCOUNTING_PRODUCT_BUY_ACCOUNT,1); // Purge search criteria if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers From 96a95d6ae18f3afec8970429c01a5154e3b85001 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Wed, 9 Dec 2015 12:55:08 +0100 Subject: [PATCH 168/206] Debug accountancy on 3.9 --- htdocs/accountancy/bookkeeping/list.php | 29 ++++- .../accountancy/class/bookkeeping.class.php | 30 +++++ .../class/html.formventilation.class.php | 2 +- htdocs/accountancy/journal/bankjournal.php | 114 ++++++------------ .../accountancy/journal/purchasesjournal.php | 4 +- htdocs/core/lib/report.lib.php | 12 +- .../install/mysql/migration/3.8.0-3.9.0.sql | 3 + .../tables/llx_accounting_bookkeeping.sql | 2 +- 8 files changed, 112 insertions(+), 84 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index b9164329031..ec108738647 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -30,6 +30,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; // Langs $langs->load("accountancy"); @@ -52,6 +53,7 @@ if ($sortfield == "") $offset = $conf->liste_limit * $page; $formventilation = new FormVentilation($db); +$formother = new FormOther($db); if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers { @@ -77,7 +79,20 @@ if ($action == 'delbookkeeping') { setEventMessages($object->error, $object->errors, 'errors'); } } -} // Export +} +elseif ($action == 'delbookkeepingyear') { + + $delyear = GETPOST('delyear', 'int'); + + if (! empty($delyear)) { + $object = new BookKeeping($db); + $result = $object->delete_by_year($delyear); + Header("Location: list.php"); + if ($result < 0) { + setEventMessages($object->error, $object->errors, 'errors'); + } + } +}// Export else if ($action == 'export_csv') { header('Content-Type: text/csv'); @@ -147,7 +162,7 @@ else { print_barre_liste($langs->trans("Bookkeeping"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num); - print '
      '; + /*print ''; print ''; print ''; @@ -155,6 +170,16 @@ else { print '
      '; + print '';*/ + + print '
      '; + print ''; + print ''; + + print $formother->select_year(GETPOST('delyear'),'delyear'); + + print '
      '; + print ''; print '
      '; diff --git a/htdocs/accountancy/class/bookkeeping.class.php b/htdocs/accountancy/class/bookkeeping.class.php index 141b122690c..2eb952a42a3 100644 --- a/htdocs/accountancy/class/bookkeeping.class.php +++ b/htdocs/accountancy/class/bookkeeping.class.php @@ -372,6 +372,36 @@ class BookKeeping extends CommonObject $this->db->commit(); return 1; } + + /** + * Delete bookkepping by importkey + * + * @param string $importkey Import key + * @return int Result + */ + function delete_by_year($delyear) { + $this->db->begin(); + + // first check if line not yet in bookkeeping + $sql = "DELETE"; + $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping "; + $sql .= " WHERE YEAR(doc_date) = ".$delyear; + + $resql = $this->db->query($sql); + + if (! $resql) { + $this->errors[] = "Error " . $this->db->lasterror(); + foreach ( $this->errors as $errmsg ) { + dol_syslog(get_class($this) . "::delete " . $errmsg, LOG_ERR); + $this->error .= ($this->error ? ', ' . $errmsg : $errmsg); + } + $this->db->rollback(); + return - 1; + } + + $this->db->commit(); + return 1; + } /** * Create object into database diff --git a/htdocs/accountancy/class/html.formventilation.class.php b/htdocs/accountancy/class/html.formventilation.class.php index de94d645c92..f92f5b3ab88 100644 --- a/htdocs/accountancy/class/html.formventilation.class.php +++ b/htdocs/accountancy/class/html.formventilation.class.php @@ -70,7 +70,7 @@ class FormVentilation extends Form $selected = ' selected '; } - $out .= ''; + $out .= ''; $i ++; } diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index be136a38b98..34ebcaf43a9 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -16,7 +16,7 @@ * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License fr more details. + * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . @@ -57,7 +57,7 @@ $langs->load("bank"); $langs->load('bills'); $langs->load("accountancy"); -$id_accountancy_journal = GETPOST('id_account','int'); +$id_bank_account = GETPOST('id_account','int'); $date_startmonth = GETPOST('date_startmonth'); $date_startday = GETPOST('date_startday'); @@ -70,17 +70,12 @@ $action = GETPOST('action'); $now = dol_now(); // Security check -if ($user->societe_id > 0) +if ($user->societe_id > 0 && empty($id_bank_account)) accessforbidden(); /* * View */ -if (empty($id_accountancy_journal)) -{ - accessforbidden(); -} - $year_current = strftime("%Y", dol_now()); $pastmonth = strftime("%m", dol_now()) - 1; $pastmonthyear = $year_current; @@ -107,7 +102,7 @@ $sql .= " FROM " . MAIN_DB_PREFIX . "bank as b"; $sql .= " JOIN " . MAIN_DB_PREFIX . "bank_account as ba on b.fk_account=ba.rowid"; $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url as bu1 ON bu1.fk_bank = b.rowid AND bu1.type='company'"; $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe as soc on bu1.url_id=soc.rowid"; -$sql .= " WHERE ba.rowid=".$id_accountancy_journal; +$sql .= " WHERE ba.rowid=".$id_bank_account; if (! empty($conf->multicompany->enabled)) { $sql .= " AND ba.entity = " . $conf->entity; } @@ -125,7 +120,12 @@ $paymentdonstatic = new PaymentDonation($db); $paymentvatstatic = new TVA($db); $paymentsalstatic = new PaymentSalary($db); -dol_syslog("accountancy/journal/bankjournal.php:: sql=" . $sql, LOG_DEBUG); +// Get code of finance journal +$bank_code_journal = new Account($db); +$result=$bank_code_journal->fetch($id_bank_account); +$journal=$bank_code_journal->accountancy_journal; + +dol_syslog("accountancy/journal/bankjournal.php", LOG_DEBUG); $result = $db->query($sql); if ($result) { @@ -288,8 +288,10 @@ if ($result) { */ // Write bookkeeping -if ($action == 'writeBookKeeping') +if ($action == 'writebookkeeping') { + $now=dol_now(); + $error = 0; foreach ( $tabpay as $key => $val ) { @@ -309,8 +311,9 @@ if ($action == 'writeBookKeeping') $bookkeeping->sens = ($mt >= 0) ? 'D' : 'C'; $bookkeeping->debit = ($mt >= 0 ? $mt : 0); $bookkeeping->credit = ($mt < 0 ? - $mt : 0); - $bookkeeping->code_journal = $conf->global->ACCOUNTING_BANK_JOURNAL; + $bookkeeping->code_journal = $journal; $bookkeeping->fk_user_author = $user->id; + $bookkeeping->date_create=$now; if ($tabtype[$key] == 'payment') { @@ -327,7 +330,7 @@ if ($action == 'writeBookKeeping') } } else if ($tabtype[$key] == 'payment_supplier') { - $sqlmid = 'SELECT facf.facnumber'; + $sqlmid = 'SELECT facf.ref_supplier,facf.ref'; $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture_fourn facf "; $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn_facturefourn as payfacf ON payfacf.fk_facturefourn=facf.rowid"; $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn as payf ON payfacf.fk_paiementfourn=payf.rowid"; @@ -336,7 +339,7 @@ if ($action == 'writeBookKeeping') $resultmid = $db->query($sqlmid); if ($resultmid) { $objmid = $db->fetch_object($resultmid); - $bookkeeping->doc_ref = $objmid->facnumber; + $bookkeeping->doc_ref = $objmid->ref_supplier.' ('.$objmid->ref.')';; } } @@ -360,8 +363,9 @@ if ($action == 'writeBookKeeping') $bookkeeping->sens = ($mt < 0) ? 'D' : 'C'; $bookkeeping->debit = ($mt < 0 ? - $mt : 0); $bookkeeping->credit = ($mt >= 0) ? $mt : 0; - $bookkeeping->code_journal = $conf->global->ACCOUNTING_BANK_JOURNAL; + $bookkeeping->code_journal = $journal; $bookkeeping->fk_user_author = $user->id; + $bookkeeping->date_create=$now; if ($tabtype[$key] == 'sc') { $bookkeeping->code_tiers = ''; @@ -383,7 +387,7 @@ if ($action == 'writeBookKeeping') $bookkeeping->numero_compte = $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER; } else if ($tabtype[$key] == 'payment_supplier') { - $sqlmid = 'SELECT facf.facnumber'; + $sqlmid = 'SELECT facf.ref_supplier,facf.ref'; $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture_fourn facf "; $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn_facturefourn as payfacf ON payfacf.fk_facturefourn=facf.rowid"; $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn as payf ON payfacf.fk_paiementfourn=payf.rowid"; @@ -392,7 +396,7 @@ if ($action == 'writeBookKeeping') $resultmid = $db->query($sqlmid); if ($resultmid) { $objmid = $db->fetch_object($resultmid); - $bookkeeping->doc_ref = $objmid->facnumber; + $bookkeeping->doc_ref = $objmid->ref_supplier.' ('.$objmid->ref.')'; } $bookkeeping->code_tiers = $k; $bookkeeping->numero_compte = $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER; @@ -433,7 +437,6 @@ if ($action == 'writeBookKeeping') if ($action == 'export_csv') { $sep = $conf->global->ACCOUNTING_EXPORT_SEPARATORCSV; - $journal = $conf->global->ACCOUNTING_BANK_JOURNAL; include DOL_DOCUMENT_ROOT.'/accountancy/tpl/export_journal.tpl.php'; @@ -443,16 +446,20 @@ if ($action == 'export_csv') { $sep = ";"; - foreach ( $tabpay as $key => $val ) { + foreach ($tabpay as $key => $val) + { $date = dol_print_date($db->jdate($val["date"]), '%d%m%Y'); $companystatic->id = $tabcompany[$key]['id']; $companystatic->name = $tabcompany[$key]['name']; + $companystatic->client = $tabcompany[$key]['code_client']; + + $date = dol_print_date($db->jdate($val["date"]), '%d%m%Y'); // Bank foreach ( $tabbq[$key] as $k => $mt ) { print $date . $sep; - print $bank_journal . $sep; + print $journal . $sep; print length_accountg(html_entity_decode($k)) . $sep; print $sep; print ($mt < 0 ? 'C' : 'D') . $sep; @@ -557,67 +564,26 @@ if ($action == 'export_csv') } } } -} -else +} +else { - $form = new Form($db); - llxHeader('', $langs->trans("BankJournal")); + llxHeader('', $langs->trans("FinanceJournal")); - $namereport = $langs->trans("BankJournal"); - $description = $langs->trans("DescBankJournal"); + $nom = $langs->trans("FinanceJournal" . ' - ' . $journal); + $builddate = time(); + $description = $langs->trans("DescFinanceJournal") . '
      '; $period = $form->select_date($date_start, 'date_start', 0, 0, 0, '', 1, 0, 1) . ' - ' . $form->select_date($date_end, 'date_end', 0, 0, 0, '', 1, 0, 1); - // Report - $h=0; - $head[$h][0] = $_SERVER["PHP_SELF"].'?id_account='.$id_accountancy_journal; - $head[$h][1] = $langs->trans("Report"); - $head[$h][2] = 'card'; - - dol_fiche_head($head, 'card', $langs->trans("BankJournal"), 0, 'payment'); - - print ''; - print '
      '.$langs->trans("Supplier")."'.$soc->getNomUrl(1,'supplier').'
      '; + if ($product_static->id) print $product_static->getNomUrl(1); else print ' '; + print '' . dol_trunc($objp->product_label, 24) . '
      '; - - // Title - print ''; - print ''; - print ''; - print ''; - print ''; - - // Period report - print ''; - print ''; - if (! $periodlink) print ''; - print ''; - - // Description - print ''; - print ''; - print ''; - print ''; - - print ''; - print ''; - print ''; - - print '
      '.$langs->trans("ReportName").''.$namereport.'
      '.$langs->trans("ReportPeriod").''; - else print ''; - if ($period) print $period; - if ($periodlink) print ''.$periodlink; - print '
      '.$langs->trans("ReportDescription").''.$description.'
      '; - - print ''; - - print '
'; - // End report + $varlink = 'id_account='.$id_bank_account; + report_header($nom, $nomlink, $period, $periodlink, $description, $builddate, $exportlink, array('action' => ''), '', $varlink); + print ''; - print ''; - + print ''; + print ' '."\n"; + print ''."\n"; } else { @@ -288,4 +288,4 @@ function displayBox($selectedDate,$month,$year) -// Copyright (C) 2005-2014 Regis Houssin -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// or see http://www.gnu.org/ + + * Copyright (C) 2005-2014 Regis Houssin + * Copyright (C) 2015 Raphaël Doursenaud + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * or see http://www.gnu.org/ + */ -// -// \file htdocs/core/js/lib_head.js -// \brief File that include javascript functions (included if option use_javascript activated) -// +/** + * \file htdocs/core/js/lib_head.js.php + * \brief File that include javascript functions (included if option use_javascript activated) + */ +//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); // Not disabled cause need to load personalized language +//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); +if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); +//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); // Not disabled cause need to do translations +if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK',1); +if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL',1); +if (! defined('NOLOGIN')) define('NOLOGIN',1); +if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU',1); +if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML',1); +if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); + +session_cache_limiter(FALSE); + +require_once '../../main.inc.php'; + +// Define javascript type +header('Content-type: text/javascript; charset=UTF-8'); +// Important: Following code is to avoid page request by browser and PHP CPU at each Dolibarr page access. +if (empty($dolibarr_nocache)) header('Cache-Control: max-age=3600, public, must-revalidate'); +else header('Cache-Control: no-cache'); +?> /* * ================================================================= @@ -923,7 +947,6 @@ function copyToClipboard(text,text2) return false; } - /* * Provide a function to get an URL GET parameter in javascript * @@ -938,3 +961,99 @@ function getParameterByName(name, valueifnotfound) results = regex.exec(location.search); return results === null ? valueifnotfound : decodeURIComponent(results[1].replace(/\+/g, " ")); } + +// Code in the public domain from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round +(function() { + /** + * Decimal adjustment of a number. + * + * @param {String} type The type of adjustment. + * @param {Number} value The number. + * @param {Integer} exp The exponent (the 10 logarithm of the adjustment base). + * @returns {Number} The adjusted value. + */ + function decimalAdjust(type, value, exp) { + // If the exp is undefined or zero... + if (typeof exp === 'undefined' || +exp === 0) { + return Math[type](value); + } + value = +value; + exp = +exp; + // If the value is not a number or the exp is not an integer... + if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) { + return NaN; + } + // Shift + value = value.toString().split('e'); + value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp))); + // Shift back + value = value.toString().split('e'); + return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)); + } + + // Decimal round + if (!Math.round10) { + Math.round10 = function(value, exp) { + return decimalAdjust('round', value, exp); + }; + } + // Decimal floor + if (!Math.floor10) { + Math.floor10 = function(value, exp) { + return decimalAdjust('floor', value, exp); + }; + } + // Decimal ceil + if (!Math.ceil10) { + Math.ceil10 = function(value, exp) { + return decimalAdjust('ceil', value, exp); + }; + } +})(); + + +/** + * Function similar to PHP price2num() + * + * @param {number|string} amount The amount to convert/clean + * @returns {string} The amount in universal numeric format (Example: '99.99999') + * @todo Implement rounding parameter + */ +function price2numjs(amount) { + if (amount == '') return ''; + + transnoentitiesnoconv("SeparatorDecimal") != "SeparatorDecimal") { + $dec = $langs->transnoentitiesnoconv("SeparatorDecimal"); + } + if ($langs->transnoentitiesnoconv("SeparatorThousand") != "SeparatorThousand") { + $thousand = $langs->transnoentitiesnoconv("SeparatorThousand"); + } + print "var dec='" . $dec . "'; var thousand='" . $thousand . "';\n"; // Set var in javascript + ?> + + var main_max_dec_shown = global->MAIN_MAX_DECIMALS_SHOWN; ?>; + var main_rounding_unit = global->MAIN_MAX_DECIMALS_UNIT; ?>; + var main_rounding_tot = global->MAIN_MAX_DECIMALS_TOT; ?>; + + var amount = amount.toString(); + + // rounding for unit price + var rounding = main_rounding_unit; + var pos = amount.indexOf(dec); + var decpart = ''; + if (pos >= 0) decpart = amount.substr(pos + 1).replace('/0+$/i', ''); // Remove 0 for decimal part + var nbdec = decpart.length; + if (nbdec > rounding) rounding = nbdec; + // If rounding higher than max shown + if (rounding > main_max_dec_shown) rounding = main_max_dec_shown; + + if (thousand != ',' && thousand != '.') amount = amount.replace(',', '.'); + amount = amount.replace(' ', ''); // To avoid spaces + amount = amount.replace(thousand, ''); // Replace of thousand before replace of dec to avoid pb if thousand is . + amount = amount.replace(dec, '.'); + + return Math.round10(amount, rounding); +} diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index 25668b2876d..485336335e6 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -464,43 +464,6 @@ if (! empty($usemargins) && $user->rights->margins->creer) return true; } - - /* Function similar to price2num in PHP */ - function price2numjs(num) - { - if (num == '') return ''; - - transnoentitiesnoconv("SeparatorDecimal") != "SeparatorDecimal") $dec=$langs->transnoentitiesnoconv("SeparatorDecimal"); - if ($langs->transnoentitiesnoconv("SeparatorThousand")!= "SeparatorThousand") $thousand=$langs->transnoentitiesnoconv("SeparatorThousand"); - print "var dec='".$dec."'; var thousand='".$thousand."';\n"; // Set var in javascript - ?> - - var main_max_dec_shown = global->MAIN_MAX_DECIMALS_SHOWN; ?>; - var main_rounding_unit = global->MAIN_MAX_DECIMALS_UNIT; ?>; - var main_rounding_tot = global->MAIN_MAX_DECIMALS_TOT; ?>; - - var amount = num.toString(); - - // rounding for unit price - var rounding = main_rounding_unit; - var pos = amount.indexOf(dec); - var decpart = ''; - if (pos >= 0) decpart = amount.substr(pos+1).replace('/0+$/i',''); // Supprime les 0 de fin de partie decimale - var nbdec = decpart.length; - if (nbdec > rounding) rounding = nbdec; - // If rounding higher than max shown - if (rounding > main_max_dec_shown) rounding = main_max_dec_shown; - - if (thousand != ',' && thousand != '.') amount=amount.replace(',','.'); - amount=amount.replace(' ',''); // To avoid spaces - amount=amount.replace(thousand,''); // Replace of thousand before replace of dec to avoid pb if thousand is . - amount=amount.replace(dec,'.'); - - return parseFloat(amount).toFixed(rounding); - } - diff --git a/htdocs/core/tpl/objectline_edit.tpl.php b/htdocs/core/tpl/objectline_edit.tpl.php index 883c1f5eea9..4316ab0b318 100644 --- a/htdocs/core/tpl/objectline_edit.tpl.php +++ b/htdocs/core/tpl/objectline_edit.tpl.php @@ -375,42 +375,6 @@ if (! empty($conf->margin->enabled)) return true; } - /* Function similar to price2num in PHP */ - function price2numjs(num) - { - if (num == '') return ''; - - transnoentitiesnoconv("SeparatorDecimal") != "SeparatorDecimal") $dec=$langs->transnoentitiesnoconv("SeparatorDecimal"); - if ($langs->transnoentitiesnoconv("SeparatorThousand")!= "SeparatorThousand") $thousand=$langs->transnoentitiesnoconv("SeparatorThousand"); - print "var dec='".$dec."'; var thousand='".$thousand."';\n"; // Set var in javascript - ?> - - var main_max_dec_shown = global->MAIN_MAX_DECIMALS_SHOWN; ?>; - var main_rounding_unit = global->MAIN_MAX_DECIMALS_UNIT; ?>; - var main_rounding_tot = global->MAIN_MAX_DECIMALS_TOT; ?>; - - var amount = num.toString(); - - // rounding for unit price - var rounding = main_rounding_unit; - var pos = amount.indexOf(dec); - var decpart = ''; - if (pos >= 0) decpart = amount.substr(pos+1).replace('/0+$/i',''); // Remove 0 for decimal part - var nbdec = decpart.length; - if (nbdec > rounding) rounding = nbdec; - // If rounding higher than max shown - if (rounding > main_max_dec_shown) rounding = main_max_dec_shown; - - if (thousand != ',' && thousand != '.') amount=amount.replace(',','.'); - amount=amount.replace(' ',''); // To avoid spaces - amount=amount.replace(thousand,''); // Replace of thousand before replace of dec to avoid pb if thousand is . - amount=amount.replace(dec,'.'); - - return parseFloat(amount).toFixed(rounding); - } - diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index a3c647a5e47..890027c9d30 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1269,7 +1269,7 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs // Global js function print ''."\n"; - print ''."\n"; + print ''."\n"; // Add datepicker default options print ''."\n"; From e193d9be971d3bead04c577fd944cc74543c4a47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Thu, 10 Dec 2015 23:08:21 +0100 Subject: [PATCH 184/206] Update CSMSFile.class.php --- htdocs/core/class/CSMSFile.class.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/core/class/CSMSFile.class.php b/htdocs/core/class/CSMSFile.class.php index 5620e641df0..b6819fdd87f 100644 --- a/htdocs/core/class/CSMSFile.class.php +++ b/htdocs/core/class/CSMSFile.class.php @@ -85,9 +85,9 @@ class CSMSFile /** - * Send mail that was prepared by constructor + * Send sms that was prepared by constructor * - * @return boolean True if mail sent, false otherwise + * @return boolean True if sms sent, false otherwise */ function sendfile() { @@ -168,7 +168,7 @@ class CSMSFile } else { - // Send mail method not correctly defined + // Send sms method not correctly defined // -------------------------------------- return 'Bad value for MAIN_SMS_SENDMODE constant'; @@ -176,7 +176,7 @@ class CSMSFile } else { - $this->error='No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_SMS'; + $this->error='No sms sent. Feature is disabled by option MAIN_DISABLE_ALL_SMS'; dol_syslog("CSMSFile::sendfile: ".$this->error, LOG_WARNING); } @@ -187,7 +187,7 @@ class CSMSFile /** - * Write content of a SMTP request into a dump file (mode = all) + * Write content of a SendSms request into a dump file (mode = all) * Used for debugging. * * @return void @@ -215,7 +215,7 @@ class CSMSFile } /** - * Write content of a SMTP request into a dump file (mode = all) + * Write content of a SendSms result into a dump file (mode = all) * Used for debugging. * * @param int $result Result of sms sending From f34fb0d82d1066bec56f9061be4955611e1aab5e Mon Sep 17 00:00:00 2001 From: Ion Agorria Date: Fri, 11 Dec 2015 03:09:09 +0100 Subject: [PATCH 185/206] More consistent check --- htdocs/core/tpl/objectline_create.tpl.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index 176c70e4a5a..bb84e47ad7d 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -518,7 +518,7 @@ jQuery(document).ready(function() { /* focus work on a standard textarea but not if field was replaced with CKEDITOR */ jQuery('#dp_desc').focus(); /* focus if CKEDITOR */ - if (typeof(CKEDITOR) !== 'undefined') + if (typeof CKEDITOR == "object" && typeof CKEDITOR.instances != "undefined" && CKEDITOR.instances[key] != "undefined") { var editor = CKEDITOR.instances['dp_desc']; if (editor) { editor.focus(); } @@ -624,7 +624,7 @@ jQuery(document).ready(function() { /* focus work on a standard textarea but not if field was replaced with CKEDITOR */ jQuery('#dp_desc').focus(); /* focus if CKEDITOR */ - if (typeof(CKEDITOR) !== 'undefined') + if (typeof CKEDITOR == "object" && typeof CKEDITOR.instances != "undefined" && CKEDITOR.instances[key] != "undefined") { var editor = CKEDITOR.instances['dp_desc']; if (editor) { editor.focus(); } From 8ccafc6e3655700fc0f9c2185a848e4ff04f1bd4 Mon Sep 17 00:00:00 2001 From: philippe grand Date: Fri, 11 Dec 2015 09:54:30 +0100 Subject: [PATCH 186/206] [Qual] Uniformize code --- htdocs/ftp/index.php | 23 +++++++++++------------ htdocs/holiday/card.php | 10 +++++----- htdocs/hrm/establishment/card.php | 6 +++--- htdocs/imports/import.php | 16 ++++++++-------- htdocs/livraison/card.php | 6 +++--- htdocs/loan/card.php | 12 ++++++------ htdocs/loan/payment/card.php | 4 ++-- htdocs/loan/payment/payment.php | 6 +++--- 8 files changed, 41 insertions(+), 42 deletions(-) diff --git a/htdocs/ftp/index.php b/htdocs/ftp/index.php index b26e7b96f86..62bb22bf328 100644 --- a/htdocs/ftp/index.php +++ b/htdocs/ftp/index.php @@ -108,15 +108,15 @@ if (GETPOST("sendit") && ! empty($conf->global->MAIN_UPLOAD_DOC)) $langs->load("errors"); if ($resupload < 0) // Unknown error { - setEventMessage($langs->trans("ErrorFileNotUploaded"), 'errors'); + setEventMessages($langs->trans("ErrorFileNotUploaded"), null, 'errors'); } else if (preg_match('/ErrorFileIsInfectedWithAVirus/',$resupload)) // Files infected by a virus { - setEventMessage($langs->trans("ErrorFileIsInfectedWithAVirus"), 'errors'); + setEventMessages($langs->trans("ErrorFileIsInfectedWithAVirus"), null, 'errors'); } else // Known error { - setEventMessage($langs->trans($resupload), 'errors'); + setEventMessages($langs->trans($resupload), null, 'errors'); } } } @@ -124,7 +124,7 @@ if (GETPOST("sendit") && ! empty($conf->global->MAIN_UPLOAD_DOC)) { // Echec transfert (fichier depassant la limite ?) $langs->load("errors"); - setEventMessage($langs->trans("ErrorFailToCreateDir",$upload_dir), 'errors'); + setEventMessages($langs->trans("ErrorFailToCreateDir",$upload_dir), null, 'errors'); } } @@ -143,8 +143,7 @@ if ($action == 'add' && $user->rights->ftp->setup) } else { - //TODO: Translate - setEventMessage('Error '.$langs->trans($ecmdir->error)); + setEventMessages($langs->trans("ErrorFailToCreateDir"), null, 'errors'); $action = "create"; } } @@ -176,12 +175,12 @@ if ($action == 'confirm_deletefile' && $_REQUEST['confirm'] == 'yes') $result=@ftp_delete($conn_id, $newremotefileiso); if ($result) { - setEventMessage($langs->trans("FileWasRemoved",$file)); + setEventMessages($langs->trans("FileWasRemoved",$file), null, 'mesgs'); } else { dol_syslog("ftp/index.php ftp_delete", LOG_ERR); - setEventMessage($langs->trans("FTPFailedToRemoveFile",$file), 'errors'); + setEventMessages($langs->trans("FTPFailedToRemoveFile",$file), null, 'errors'); } //ftp_close($conn_id); Close later @@ -226,12 +225,12 @@ if ($_POST["const"] && $_POST["delete"] && $_POST["delete"] == $langs->trans("De $result=@ftp_delete($conn_id, $newremotefileiso); if ($result) { - setEventMessage($langs->trans("FileWasRemoved",$file)); + setEventMessages($langs->trans("FileWasRemoved",$file), null, 'mesgs'); } else { dol_syslog("ftp/index.php ftp_delete", LOG_ERR); - setEventMessage($langs->trans("FTPFailedToRemoveFile",$file), 'errors'); + setEventMessages($langs->trans("FTPFailedToRemoveFile",$file), null, 'errors'); } //ftp_close($conn_id); Close later @@ -270,11 +269,11 @@ if ($action == 'confirm_deletesection' && $confirm == 'yes') $result=@ftp_rmdir($conn_id, $newremotefileiso); if ($result) { - setEventMessage($langs->trans("DirWasRemoved",$file)); + setEventMessages($langs->trans("DirWasRemoved",$file), null, 'mesgs'); } else { - setEventMessage($langs->trans("FTPFailedToRemoveDir",$file), 'errors'); + setEventMessages($langs->trans("FTPFailedToRemoveDir",$file), null, 'errors'); } //ftp_close($conn_id); Close later diff --git a/htdocs/holiday/card.php b/htdocs/holiday/card.php index 7802e0c32fa..80d06fdb446 100644 --- a/htdocs/holiday/card.php +++ b/htdocs/holiday/card.php @@ -60,7 +60,7 @@ if ($action == 'create') if (($userid == $user->id && empty($user->rights->holiday->write)) || ($userid != $user->id && empty($user->rights->holiday->write_all))) { $error++; - setEventMessage($langs->trans('CantCreateCP')); + setEventMessages($langs->trans('CantCreateCP'), null, 'errors'); $action='request'; } @@ -130,7 +130,7 @@ if ($action == 'create') // If no validator designated if ($valideur < 1) { - setEventMessage($langs->transnoentitiesnoconv('InvalidValidatorCP'), 'errors'); + setEventMessages($langs->transnoentitiesnoconv('InvalidValidatorCP'), null, 'errors'); $error++; } @@ -138,7 +138,7 @@ if ($action == 'create') if ($type < 1) { - setEventMessage($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Type")), 'errors'); + setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Type")), null, 'errors'); $error++; } @@ -723,7 +723,7 @@ if (empty($id) || $action == 'add' || $action == 'request' || $action == 'create break; } - setEventMessage($errors, 'errors'); + setEventMessages($errors, null, 'errors'); } @@ -946,7 +946,7 @@ else break; } - setEventMessage($errors, 'errors'); + setEventMessages($errors, null, 'errors'); } // On vérifie si l'utilisateur à le droit de lire cette demande diff --git a/htdocs/hrm/establishment/card.php b/htdocs/hrm/establishment/card.php index 10a1b42e961..fb6f41f4f39 100644 --- a/htdocs/hrm/establishment/card.php +++ b/htdocs/hrm/establishment/card.php @@ -62,7 +62,7 @@ if ($action == 'confirm_delete' && $confirm == "yes") } else { - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } @@ -75,7 +75,7 @@ else if ($action == 'add') $object->name = GETPOST('name', 'alpha'); if (empty($object->name)) { - setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Name")), 'errors'); + setEventMessages($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Name")), null, 'errors'); $error++; } @@ -124,7 +124,7 @@ else if ($action == 'update') $name = GETPOST('name', 'alpha'); if (empty($name)) { - setEventMessage($langs->trans('ErrorFieldRequired', $langs->trans('Name')), 'errors'); + setEventMessages($langs->trans('ErrorFieldRequired', $langs->trans('Name')), null, 'errors'); $error ++; } diff --git a/htdocs/imports/import.php b/htdocs/imports/import.php index dd228af1847..9e729fb36ac 100644 --- a/htdocs/imports/import.php +++ b/htdocs/imports/import.php @@ -139,11 +139,11 @@ if ($action == 'builddoc') $result=$objimport->build_file($user, GETPOST('model','alpha'), $datatoimport, $array_match_file_to_database); if ($result < 0) { - setEventMessage($objimport->error, 'errors'); + setEventMessages($objimport->error, $objimport->errors, 'errors'); } else { - setEventMessage($langs->trans("FileSuccessfullyBuilt")); + setEventMessages($langs->trans("FileSuccessfullyBuilt"), null, 'mesgs'); } } @@ -176,17 +176,17 @@ if ($action == 'add_import_model') $result = $objimport->create($user); if ($result >= 0) { - setEventMessage($langs->trans("ImportModelSaved",$objimport->model_name)); + setEventMessages($langs->trans("ImportModelSaved", $objimport->model_name), null, 'mesgs'); } else { $langs->load("errors"); if ($objimport->errno == 'DB_ERROR_RECORD_ALREADY_EXISTS') { - setEventMessage($langs->trans("ErrorImportDuplicateProfil"), 'errors'); + setEventMessages($langs->trans("ErrorImportDuplicateProfil"), null, 'errors'); } else { - setEventMessage($objimport->error, 'errors'); + setEventMessages($objimport->error, null, 'errors'); } } } @@ -211,7 +211,7 @@ if ($step == 3 && $datatoimport) else { $langs->load("errors"); - setEventMessage($langs->trans("ErrorFailedToSaveFile"), 'errors'); + setEventMessages($langs->trans("ErrorFailedToSaveFile"), null, 'errors'); } } @@ -225,8 +225,8 @@ if ($step == 3 && $datatoimport) $file = $conf->import->dir_temp . '/' . GETPOST('urlfile'); // Do not use urldecode here ($_GET and $_REQUEST are already decoded by PHP). $ret=dol_delete_file($file); - if ($ret) setEventMessage($langs->trans("FileWasRemoved", GETPOST('urlfile'))); - else setEventMessage($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), 'errors'); + if ($ret) setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile')), null, 'mesgs'); + else setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), null, 'errors'); Header('Location: '.$_SERVER["PHP_SELF"].'?step='.$step.$param); exit; } diff --git a/htdocs/livraison/card.php b/htdocs/livraison/card.php index ec4feeb6bf9..8e2007480c1 100644 --- a/htdocs/livraison/card.php +++ b/htdocs/livraison/card.php @@ -113,7 +113,7 @@ if ($action == 'add') } else { - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); $db->rollback(); $_GET["commande_id"]=$_POST["commande_id"]; @@ -216,8 +216,8 @@ elseif ($action == 'remove_file') $upload_dir = $conf->expedition->dir_output . "/receipt"; $file = $upload_dir . '/' . GETPOST('file'); $ret=dol_delete_file($file,0,0,0,$object); - if ($ret) setEventMessage($langs->trans("FileWasRemoved", GETPOST('urlfile'))); - else setEventMessage($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), 'errors'); + if ($ret) setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile')), null, 'mesgs'); + else setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), null, 'errors'); } diff --git a/htdocs/loan/card.php b/htdocs/loan/card.php index a6e9f352d4e..b575536f950 100644 --- a/htdocs/loan/card.php +++ b/htdocs/loan/card.php @@ -54,11 +54,11 @@ if ($action == 'confirm_paid' && $confirm == 'yes') $result = $object->set_paid($user); if ($result > 0) { - setEventMessage($langs->trans('LoanPaid')); + setEventMessages($langs->trans('LoanPaid'), null, 'mesgs'); } else { - setEventMessage($loan->error, 'errors'); + setEventMessages($loan->error, null, 'errors'); } } @@ -69,13 +69,13 @@ if ($action == 'confirm_delete' && $confirm == 'yes') $result=$object->delete($user); if ($result > 0) { - setEventMessage($langs->trans('LoanDeleted')); + setEventMessages($langs->trans('LoanDeleted'), null, 'mesgs'); header("Location: index.php"); exit; } else { - setEventMessage($loan->error, 'errors'); + setEventMessages($loan->error, null, 'errors'); } } @@ -121,7 +121,7 @@ if ($action == 'add' && $user->rights->loan->write) $id=$object->create($user); if ($id <= 0) { - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } @@ -157,7 +157,7 @@ else if ($action == 'update' && $user->rights->loan->write) } else { - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } else diff --git a/htdocs/loan/payment/card.php b/htdocs/loan/payment/card.php index 8d8b5dd1ecf..6315264bad7 100644 --- a/htdocs/loan/payment/card.php +++ b/htdocs/loan/payment/card.php @@ -65,7 +65,7 @@ if ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->loan->del } else { - setEventMessage($payment->error, 'errors'); + setEventMessages($payment->error, $payment->errors, 'errors'); $db->rollback(); } } @@ -103,7 +103,7 @@ if ($action == 'confirm_valide' && $confirm == 'yes' && $user->rights->loan->wri } else { - setEventMessage($payment->error); + setEventMessages($payment->error, $payment->errors, 'errors'); $db->rollback(); } } diff --git a/htdocs/loan/payment/payment.php b/htdocs/loan/payment/payment.php index 69cfecbe5c2..f095272d5f2 100644 --- a/htdocs/loan/payment/payment.php +++ b/htdocs/loan/payment/payment.php @@ -83,7 +83,7 @@ if ($action == 'add_payment') $amount = GETPOST('amount_capital') + GETPOST('amount_insurance') + GETPOST('amount_interest'); if ($amount == 0) { - setEventMessage($langs->trans('ErrorNoPaymentDefined'), 'errors'); + setEventMessages($langs->trans('ErrorNoPaymentDefined'), null, 'errors'); $error++; } @@ -109,7 +109,7 @@ if ($action == 'add_payment') $paymentid = $payment->create($user); if ($paymentid < 0) { - setEventMessage($payment->error, 'errors'); + setEventMessages($payment->error, $payment->errors, 'errors'); $error++; } } @@ -119,7 +119,7 @@ if ($action == 'add_payment') $result = $payment->addPaymentToBank($user, 'payment_loan', '(LoanPayment)', GETPOST('accountid', 'int'), '', ''); if (! $result > 0) { - setEventMessage($payment->error, 'errors'); + setEventMessages($payment->error, $payment->errors, 'errors'); $error++; } } From 8edf3c65c6ba67a532c300b411f0de178b6762ae Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Fri, 11 Dec 2015 11:46:22 +0100 Subject: [PATCH 187/206] work on accounting --- htdocs/accountancy/admin/account.php | 4 +-- htdocs/accountancy/admin/card.php | 4 +-- htdocs/accountancy/bookkeeping/list.php | 31 +++++++++++++++++-- htdocs/accountancy/customer/list.php | 15 ++++----- htdocs/accountancy/journal/bankjournal.php | 30 +++++++++++------- .../accountancy/journal/purchasesjournal.php | 12 +++---- htdocs/accountancy/journal/sellsjournal.php | 8 ++--- htdocs/accountancy/supplier/list.php | 4 +-- 8 files changed, 71 insertions(+), 37 deletions(-) diff --git a/htdocs/accountancy/admin/account.php b/htdocs/accountancy/admin/account.php index 0bf37a7753e..c46e07893a3 100644 --- a/htdocs/accountancy/admin/account.php +++ b/htdocs/accountancy/admin/account.php @@ -76,7 +76,7 @@ if ($action == 'disable') { $action = 'update'; if ($result < 0) { - setEventMessage($accounting->error, 'errors'); + setEventMessages($accounting->error, $accounting->errors, 'errors'); } } else if ($action == 'enable') { if ($accounting->fetch($id)) { @@ -84,7 +84,7 @@ if ($action == 'disable') { } $action = 'update'; if ($result < 0) { - setEventMessage($accounting->error, 'errors'); + setEventMessages($accounting->error, $accounting->errors, 'errors'); } } diff --git a/htdocs/accountancy/admin/card.php b/htdocs/accountancy/admin/card.php index 51c6a5c6715..99eb49949e7 100644 --- a/htdocs/accountancy/admin/card.php +++ b/htdocs/accountancy/admin/card.php @@ -125,7 +125,7 @@ else if ($action == 'delete') } if ($result < 0) { - setEventMessage($accounting->error, 'errors'); + setEventMessages($accounting->error, $accounting->errors, 'errors'); } } @@ -139,7 +139,7 @@ $htmlacc = new FormVentilation($db); if ($action == 'create') { - print_fiche_titre($langs->trans('NewAccount')); + print load_fiche_titre($langs->trans('NewAccount')); print '
' . "\n"; print ''; diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index d9b6d66b503..851b095baff 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -30,6 +30,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; require_once DOL_DOCUMENT_ROOT.'/accountancy/class/bookkeeping.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; // Langs $langs->load("accountancy"); @@ -52,6 +53,7 @@ if ($sortfield == "") $offset = $conf->liste_limit * $page; $formventilation = new FormVentilation($db); +$formother = new FormOther($db); if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers { @@ -74,7 +76,20 @@ if ($action == 'delbookkeeping') { $result = $object->delete_by_importkey($import_key); Header("Location: list.php"); if ($result < 0) { - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); + } + } +} +elseif ($action == 'delbookkeepingyear') { + + $delyear = GETPOST('delyear', 'int'); + + if (! empty($delyear)) { + $object = new BookKeeping($db); + $result = $object->delete_by_year($delyear); + Header("Location: list.php"); + if ($result < 0) { + setEventMessages($object->error, $object->errors, 'errors'); } } } // Export @@ -86,7 +101,7 @@ else if ($action == 'export_csv') { $object = new BookKeeping($db); $result = $object->export_bookkeping('ebp'); if ($result < 0) { - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } foreach ( $object->linesexport as $line ) { @@ -147,7 +162,7 @@ else { print_barre_liste($langs->trans("Bookkeeping"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num); - print ''; + /*print ''; print ''; print ''; @@ -155,6 +170,16 @@ else { print '
'; + print '
';*/ + + print '
'; + print ''; + print ''; + + print $formother->select_year(GETPOST('delyear'),'delyear'); + + print '
'; + print '
'; print '
'; diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php index c03afd3bcde..321bc5b483b 100644 --- a/htdocs/accountancy/customer/list.php +++ b/htdocs/accountancy/customer/list.php @@ -87,10 +87,9 @@ if (! $user->rights->accounting->ventilation->dispatch) accessforbidden(); $formventilation = new FormVentilation($db); - $accounting = new AccountingAccount($db); -$aarowid_s = $accounting->fetch('', ACCOUNTING_SERVICE_SOLD_ACCOUNT); -$aarowid_p = $accounting->fetch('', ACCOUNTING_PRODUCT_SOLD_ACCOUNT); +$aarowid_s = $accounting->fetch('', $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT,1); +$aarowid_p = $accounting->fetch('',$conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT,1); // Purge search criteria if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) { @@ -242,7 +241,7 @@ if ($result) { print_liste_field_titre($langs->trans("Description"), $_SERVER["PHP_SELF"], "l.description", "", $param, '', $sortfield, $sortorder); print_liste_field_titre($langs->trans("Amount"), $_SERVER["PHP_SELF"],"l.total_ht","",$param,'align="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("VATRate"), $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, 'align="center"', $sortfield, $sortorder); - print_liste_field_titre($langs->trans("AccountAccounting"), '', '', '', '', 'align="center"'); + print_liste_field_titre($langs->trans("AccountAccountingSuggest"), '', '', '', '', 'align="center"'); print_liste_field_titre($langs->trans("IntoAccount"), '', '', '', '', 'align="center"'); print_liste_field_titre(''); print_liste_field_titre($langs->trans("Ventilate") . '
/', '', '', '', '', 'align="center"'); @@ -292,12 +291,14 @@ if ($result) { } if ($objp->type_l == 1) { $objp->code_sell_l = (! empty($conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); - if ($objp->aarowid == '') + if ($objp->aarowid == '') { $objp->aarowid_suggest = $aarowid_s; + } } elseif ($objp->type_l == 0) { $objp->code_sell_l = (! empty($conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); - if ($objp->aarowid == '') + if ($objp->aarowid == '') { $objp->aarowid_suggest = $aarowid_p; + } } if ($objp->code_sell_l != $objp->code_sell_p) $code_sell_p_l_differ = 'color:red'; @@ -333,7 +334,7 @@ if ($result) { if ($objp->code_sell_l == $objp->code_sell_p) { print $objp->code_sell_l; } else { - print 'lines=' . $objp->code_sell_l . '
product=' . $objp->code_sell_p; + print $langs->trans("Purchase") . ' = ' . $objp->code_sell_l . '
' . $langs->trans("Sell") . ' = ' . $objp->code_sell_p; } print ''; diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index b08391495c1..0f08c38ad65 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -25,7 +25,7 @@ /** * \file htdocs/accountancy/journal/bankjournal.php * \ingroup Accounting Expert - * \brief Page with sells journal + * \brief Page with bank journal */ require '../../main.inc.php'; @@ -66,6 +66,8 @@ $date_endday = GETPOST('date_endday'); $date_endyear = GETPOST('date_endyear'); $action = GETPOST('action'); +$now = dol_now(); + // Security check if ($user->societe_id > 0 && empty($id_bank_account)) accessforbidden(); @@ -121,7 +123,7 @@ $bank_code_journal = new Account($db); $result=$bank_code_journal->fetch($id_bank_account); $journal=$bank_code_journal->accountancy_journal; -dol_syslog("accountancy/journal/bankjournal.php:: sql=" . $sql, LOG_DEBUG); +dol_syslog("accountancy/journal/bankjournal.php", LOG_DEBUG); $result = $db->query($sql); if ($result) { @@ -280,6 +282,8 @@ if ($result) { // Write bookkeeping if ($action == 'writebookkeeping') { + $now=dol_now(); + $error = 0; foreach ( $tabpay as $key => $val ) { @@ -301,6 +305,7 @@ if ($action == 'writebookkeeping') $bookkeeping->credit = ($mt < 0 ? - $mt : 0); $bookkeeping->code_journal = $journal; $bookkeeping->fk_user_author = $user->id; + $bookkeeping->date_create=$now; if ($tabtype[$key] == 'payment') { @@ -317,7 +322,7 @@ if ($action == 'writebookkeeping') } } else if ($tabtype[$key] == 'payment_supplier') { - $sqlmid = 'SELECT facf.facnumber'; + $sqlmid = 'SELECT facf.ref_supplier,facf.ref'; $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture_fourn facf "; $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn_facturefourn as payfacf ON payfacf.fk_facturefourn=facf.rowid"; $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn as payf ON payfacf.fk_paiementfourn=payf.rowid"; @@ -326,14 +331,14 @@ if ($action == 'writebookkeeping') $resultmid = $db->query($sqlmid); if ($resultmid) { $objmid = $db->fetch_object($resultmid); - $bookkeeping->doc_ref = $objmid->facnumber; + $bookkeeping->doc_ref = $objmid->ref_supplier.' ('.$objmid->ref.')';; } } $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } // Third party @@ -352,6 +357,7 @@ if ($action == 'writebookkeeping') $bookkeeping->credit = ($mt >= 0) ? $mt : 0; $bookkeeping->code_journal = $journal; $bookkeeping->fk_user_author = $user->id; + $bookkeeping->date_create=$now; if ($tabtype[$key] == 'sc') { $bookkeeping->code_tiers = ''; @@ -373,7 +379,7 @@ if ($action == 'writebookkeeping') $bookkeeping->numero_compte = $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER; } else if ($tabtype[$key] == 'payment_supplier') { - $sqlmid = 'SELECT facf.facnumber'; + $sqlmid = 'SELECT facf.ref_supplier,facf.ref'; $sqlmid .= " FROM " . MAIN_DB_PREFIX . "facture_fourn facf "; $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn_facturefourn as payfacf ON payfacf.fk_facturefourn=facf.rowid"; $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementfourn as payf ON payfacf.fk_paiementfourn=payf.rowid"; @@ -382,7 +388,7 @@ if ($action == 'writebookkeeping') $resultmid = $db->query($sqlmid); if ($resultmid) { $objmid = $db->fetch_object($resultmid); - $bookkeeping->doc_ref = $objmid->facnumber; + $bookkeeping->doc_ref = $objmid->ref_supplier.' ('.$objmid->ref.')'; } $bookkeeping->code_tiers = $k; $bookkeeping->numero_compte = $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER; @@ -410,17 +416,18 @@ if ($action == 'writebookkeeping') $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } if (empty($error)) { - setEventMessage($langs->trans("GeneralLedgerIsWritten"),'mesgs'); + setEventMessages($langs->trans("GeneralLedgerIsWritten"), null, 'mesgs'); } } // Export -if ($action == 'export_csv') { +if ($action == 'export_csv') +{ $sep = $conf->global->ACCOUNTING_EXPORT_SEPARATORCSV; header('Content-Type: text/csv'); @@ -497,7 +504,8 @@ if ($action == 'export_csv') { } } } - } else { // Model Classic Export + } else // Model Classic Export + { foreach ( $tabpay as $key => $val ) { $date = dol_print_date($db->jdate($val["date"]), 'day'); diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php index 5844700748a..90443eb4bc1 100644 --- a/htdocs/accountancy/journal/purchasesjournal.php +++ b/htdocs/accountancy/journal/purchasesjournal.php @@ -84,7 +84,7 @@ if (empty($date_start) || empty($date_end)) // We define date_start and date_end $p = explode(":", $conf->global->MAIN_INFO_SOCIETE_COUNTRY); $idpays = $p[0]; -$sql = "SELECT f.rowid, f.ref, f.type, f.datef as df, f.libelle,"; +$sql = "SELECT f.rowid, f.ref, f.type, f.datef as df, f.libelle,f.ref_supplier,"; $sql .= " fd.rowid as fdid, fd.description, fd.total_ttc, fd.tva_tx, fd.total_ht, fd.tva as total_tva, fd.product_type,"; $sql .= " s.rowid as socid, s.nom as name, s.code_compta_fournisseur, s.fournisseur,"; $sql .= " s.code_compta_fournisseur, p.accountancy_code_buy , ct.accountancy_code_buy as account_tva, aa.rowid as fk_compte, aa.account_number as compte, aa.label as label_compte"; @@ -135,7 +135,7 @@ if ($result) { $compta_tva = (! empty($obj->account_tva) ? $obj->account_tva : $cpttva); $tabfac[$obj->rowid]["date"] = $obj->df; - $tabfac[$obj->rowid]["ref"] = $obj->ref; + $tabfac[$obj->rowid]["ref"] = $obj->ref_supplier.' ('.$obj->ref.')'; $tabfac[$obj->rowid]["type"] = $obj->type; $tabfac[$obj->rowid]["description"] = $obj->description; $tabfac[$obj->rowid]["fk_facturefourndet"] = $obj->fdid; @@ -183,7 +183,7 @@ if ($action == 'writebookkeeping') { $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } @@ -213,7 +213,7 @@ if ($action == 'writebookkeeping') { $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } @@ -244,14 +244,14 @@ if ($action == 'writebookkeeping') { $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } } if (empty($error)) { - setEventMessage($langs->trans("GeneralLedgerIsWritten"),'mesgs'); + setEventMessages($langs->trans("GeneralLedgerIsWritten"), null, 'mesgs'); } } diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index 8535e59aa26..38d9c26dcb1 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -218,7 +218,7 @@ if ($action == 'writebookkeeping') $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } @@ -248,7 +248,7 @@ if ($action == 'writebookkeeping') $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } @@ -280,14 +280,14 @@ if ($action == 'writebookkeeping') $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } } if (empty($error)) { - setEventMessage($langs->trans("GeneralLedgerIsWritten"),'mesgs'); + setEventMessages($langs->trans("GeneralLedgerIsWritten"), null, 'mesgs'); } } diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index e261dfff350..ea2ed8de0eb 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -94,8 +94,8 @@ $formventilation = new FormVentilation($db); $accounting = new AccountingAccount($db); // TODO: we should need to check if result is a really exist accountaccount rowid..... -$aarowid_s = $accounting->fetch('', ACCOUNTING_SERVICE_BUY_ACCOUNT); -$aarowid_p = $accounting->fetch('', ACCOUNTING_PRODUCT_BUY_ACCOUNT); +$aarowid_s = $accounting->fetch('', $conf->global->ACCOUNTING_SERVICE_BUY_ACCOUNT,1); +$aarowid_p = $accounting->fetch('', $conf->global->ACCOUNTING_PRODUCT_BUY_ACCOUNT,1); // Purge search criteria if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers From 9b0dd8159e05d1d9fc2d7a4d5e0e41a5f03dee42 Mon Sep 17 00:00:00 2001 From: philippe grand Date: Fri, 11 Dec 2015 12:29:19 +0100 Subject: [PATCH 188/206] [Qual] Close database handler should be after Footer --- htdocs/accountancy/admin/card.php | 5 +++-- htdocs/accountancy/admin/fiscalyear_info.php | 3 +-- htdocs/accountancy/journal/bankjournal.php | 3 +-- htdocs/accountancy/journal/index.php | 4 ++-- htdocs/accountancy/journal/purchasesjournal.php | 3 +-- htdocs/accountancy/journal/sellsjournal.php | 4 +--- htdocs/adherents/info_subscription.php | 3 +-- htdocs/admin/menus/edit.php | 4 +--- htdocs/admin/system/os.php | 1 + 9 files changed, 12 insertions(+), 18 deletions(-) diff --git a/htdocs/accountancy/admin/card.php b/htdocs/accountancy/admin/card.php index 99eb49949e7..dc8dac4f959 100644 --- a/htdocs/accountancy/admin/card.php +++ b/htdocs/accountancy/admin/card.php @@ -303,6 +303,7 @@ else if ($id) dol_print_error($db); } } -$db->close(); -llxFooter(); \ No newline at end of file +llxFooter(); + +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/admin/fiscalyear_info.php b/htdocs/accountancy/admin/fiscalyear_info.php index ddd0eaaab98..00d50d273af 100644 --- a/htdocs/accountancy/admin/fiscalyear_info.php +++ b/htdocs/accountancy/admin/fiscalyear_info.php @@ -55,6 +55,5 @@ if ($id) print '
'; } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index be136a38b98..a1f1e3fff59 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -709,7 +709,6 @@ else print ""; - // End of page - llxFooter(); } +llxFooter(); $db->close(); diff --git a/htdocs/accountancy/journal/index.php b/htdocs/accountancy/journal/index.php index 9906c68d0c8..c7a57512073 100644 --- a/htdocs/accountancy/journal/index.php +++ b/htdocs/accountancy/journal/index.php @@ -42,5 +42,5 @@ llxHeader('', 'Journaux', ''); $form = new Form($db); // End of page -$db->close(); -llxFooter(); \ No newline at end of file +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php index 538edaa471d..eb9c2baa088 100644 --- a/htdocs/accountancy/journal/purchasesjournal.php +++ b/htdocs/accountancy/journal/purchasesjournal.php @@ -488,7 +488,6 @@ if ($action == 'export_csv') print ""; - // End of page - llxFooter(); } +llxFooter(); $db->close(); diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index aaf3beea8a1..51f4766cc18 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -531,8 +531,6 @@ if ($action == 'export_csv') print ""; - // End of page - llxFooter(); } - +llxFooter(); $db->close(); diff --git a/htdocs/adherents/info_subscription.php b/htdocs/adherents/info_subscription.php index cc7902af358..f9dc5ff17af 100644 --- a/htdocs/adherents/info_subscription.php +++ b/htdocs/adherents/info_subscription.php @@ -77,6 +77,5 @@ print ''; print '
'; -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/admin/menus/edit.php b/htdocs/admin/menus/edit.php index 2fed48d470c..f4f1bbb96bf 100644 --- a/htdocs/admin/menus/edit.php +++ b/htdocs/admin/menus/edit.php @@ -466,7 +466,5 @@ elseif ($action == 'edit') print '
'; } - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/admin/system/os.php b/htdocs/admin/system/os.php index 2e9e56565c0..01d48f2444d 100644 --- a/htdocs/admin/system/os.php +++ b/htdocs/admin/system/os.php @@ -51,3 +51,4 @@ print ''; llxFooter(); +$db->close(); From 30eb08151dc2dc945a2b13be198a75975b79bd9d Mon Sep 17 00:00:00 2001 From: philippe grand Date: Fri, 11 Dec 2015 14:19:38 +0100 Subject: [PATCH 189/206] [Qual] Close database handler should be after Footer --- htdocs/admin/compta.php | 2 +- htdocs/admin/confexped.php | 3 +-- htdocs/admin/external_rss.php | 5 ++--- htdocs/admin/ldap.php | 3 +-- htdocs/admin/ldap_contacts.php | 3 +-- htdocs/admin/ldap_groups.php | 3 +-- htdocs/admin/ldap_users.php | 3 +-- htdocs/admin/perms.php | 4 +--- htdocs/admin/prelevement.php | 3 +-- htdocs/admin/proxy.php | 3 +-- htdocs/admin/supplier_proposal.php | 1 + htdocs/admin/taxes.php | 3 +-- htdocs/api/admin/explorer.php | 1 + htdocs/asterisk/wrapper.php | 1 + htdocs/bookmarks/admin/bookmark.php | 3 +-- htdocs/cashdesk/admin/cashdesk.php | 3 +-- htdocs/categories/admin/categorie.php | 4 ++-- htdocs/comm/action/info.php | 3 +-- htdocs/comm/action/rapport/index.php | 4 +--- htdocs/comm/mailing/info.php | 3 +-- htdocs/comm/multiprix.php | 3 +-- htdocs/comm/prospect/recap-prospect.php | 4 +--- htdocs/comm/recap-client.php | 4 +--- htdocs/comm/remise.php | 3 +-- htdocs/comm/remx.php | 3 +-- htdocs/commande/info.php | 4 +--- htdocs/compta/bank/bilan.php | 3 +-- htdocs/compta/bank/budget.php | 3 +-- htdocs/compta/bank/card.php | 5 +---- htdocs/compta/bank/info.php | 4 +--- htdocs/compta/bank/search.php | 4 +--- htdocs/compta/bank/treso.php | 3 +-- htdocs/compta/bank/virement.php | 3 +-- htdocs/compta/clients.php | 3 +-- htdocs/compta/deplacement/info.php | 3 +-- htdocs/compta/facture/info.php | 3 +-- htdocs/compta/localtax/card.php | 4 +--- htdocs/compta/localtax/clients.php | 4 +--- htdocs/compta/localtax/index.php | 3 +-- htdocs/compta/localtax/quadri_detail.php | 3 +-- htdocs/compta/localtax/reglement.php | 3 +-- htdocs/compta/paiement/avalider.php | 3 +-- htdocs/compta/paiement/index.php | 5 +---- htdocs/compta/paiement/info.php | 3 +-- htdocs/compta/paiement_charge.php | 4 +--- htdocs/compta/prelevement/create.php | 4 +--- htdocs/compta/prelevement/demandes.php | 2 +- htdocs/compta/prelevement/fiche-rejet.php | 3 +-- htdocs/compta/prelevement/fiche-stat.php | 3 +-- htdocs/compta/prelevement/list.php | 4 +--- htdocs/compta/prelevement/rejets.php | 3 +-- htdocs/compta/sociales/index.php | 6 +----- htdocs/compta/tva/card.php | 4 +--- htdocs/compta/tva/index.php | 4 +--- htdocs/compta/tva/quadri.php | 4 +--- htdocs/compta/tva/quadri_detail.php | 3 +-- htdocs/compta/tva/quarter_report.php | 3 +-- htdocs/compta/ventilation/card.php | 3 +-- htdocs/compta/ventilation/fournisseur/card.php | 3 +-- htdocs/compta/ventilation/fournisseur/list.php | 2 +- htdocs/contrat/info.php | 3 +-- htdocs/cron/info.php | 5 ++--- 62 files changed, 65 insertions(+), 139 deletions(-) diff --git a/htdocs/admin/compta.php b/htdocs/admin/compta.php index 38ba28e9fa4..ab6a0052341 100644 --- a/htdocs/admin/compta.php +++ b/htdocs/admin/compta.php @@ -166,6 +166,6 @@ print "\n"; print '

'; print ''; -$db->close(); llxFooter(); +$db->close(); diff --git a/htdocs/admin/confexped.php b/htdocs/admin/confexped.php index f8d13421b24..91d3b82286c 100644 --- a/htdocs/admin/confexped.php +++ b/htdocs/admin/confexped.php @@ -158,6 +158,5 @@ print '
'; print info_admin($langs->trans("NoNeedForDeliveryReceipts")); -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/admin/external_rss.php b/htdocs/admin/external_rss.php index 81f6c093d5e..f18a3fe86b6 100644 --- a/htdocs/admin/external_rss.php +++ b/htdocs/admin/external_rss.php @@ -5,7 +5,7 @@ * Copyright (C) 2004 Sebastien Di Cintio * Copyright (C) 2004 Benoit Mortier * Copyright (C) 2005-2011 Regis Houssin - * Copyright (C) 2011 Juanjo Menent + * Copyright (C) 2011 Juanjo Menent * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -320,6 +320,5 @@ else } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/admin/ldap.php b/htdocs/admin/ldap.php index fadde40dbed..92c4d20670b 100644 --- a/htdocs/admin/ldap.php +++ b/htdocs/admin/ldap.php @@ -325,6 +325,5 @@ if (function_exists("ldap_connect")) } } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/admin/ldap_contacts.php b/htdocs/admin/ldap_contacts.php index 56b755bf64a..4901c127e8b 100644 --- a/htdocs/admin/ldap_contacts.php +++ b/htdocs/admin/ldap_contacts.php @@ -337,7 +337,6 @@ if (function_exists("ldap_connect")) } } +llxFooter(); $db->close(); -llxFooter(); - diff --git a/htdocs/admin/ldap_groups.php b/htdocs/admin/ldap_groups.php index 20b94023358..90946f5ea44 100644 --- a/htdocs/admin/ldap_groups.php +++ b/htdocs/admin/ldap_groups.php @@ -257,6 +257,5 @@ if (function_exists("ldap_connect")) } } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/admin/ldap_users.php b/htdocs/admin/ldap_users.php index 70a94e5817a..dbed44ca5d0 100644 --- a/htdocs/admin/ldap_users.php +++ b/htdocs/admin/ldap_users.php @@ -452,6 +452,5 @@ if (function_exists("ldap_connect")) } } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/admin/perms.php b/htdocs/admin/perms.php index aaf2f91688a..2e0ba0873bf 100644 --- a/htdocs/admin/perms.php +++ b/htdocs/admin/perms.php @@ -218,7 +218,5 @@ print ''; print '
'; - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/admin/prelevement.php b/htdocs/admin/prelevement.php index 1a3fd19aa1c..410851b640b 100644 --- a/htdocs/admin/prelevement.php +++ b/htdocs/admin/prelevement.php @@ -284,6 +284,5 @@ if (! empty($conf->global->MAIN_MODULE_NOTIFICATION)) } */ -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/admin/proxy.php b/htdocs/admin/proxy.php index 4591c4636a8..1f6e45223b4 100644 --- a/htdocs/admin/proxy.php +++ b/htdocs/admin/proxy.php @@ -208,6 +208,5 @@ print '
'; print ''; -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/admin/supplier_proposal.php b/htdocs/admin/supplier_proposal.php index c10592487da..069c90ead8a 100644 --- a/htdocs/admin/supplier_proposal.php +++ b/htdocs/admin/supplier_proposal.php @@ -603,6 +603,7 @@ print " ".$langs->trans("Value")."\n"; print "\n"; print "\n ".$langs->trans("PathDirectory")."\n ".$conf->supplier_proposal->dir_output."\n\n"; print "\n
"; + llxFooter(); $db->close(); diff --git a/htdocs/admin/taxes.php b/htdocs/admin/taxes.php index b1ce8ef5dab..0336547fd14 100644 --- a/htdocs/admin/taxes.php +++ b/htdocs/admin/taxes.php @@ -226,6 +226,5 @@ print '
'; print ''; -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/api/admin/explorer.php b/htdocs/api/admin/explorer.php index 154e8d163c1..44a14f99675 100644 --- a/htdocs/api/admin/explorer.php +++ b/htdocs/api/admin/explorer.php @@ -162,4 +162,5 @@ foreach($listofapis['v1'] as $key => $val) } llxFooter(); +$db->close(); diff --git a/htdocs/asterisk/wrapper.php b/htdocs/asterisk/wrapper.php index f168de78b6e..bcd5957dbb3 100644 --- a/htdocs/asterisk/wrapper.php +++ b/htdocs/asterisk/wrapper.php @@ -190,3 +190,4 @@ else { } llxFooter(); +$db->close(); diff --git a/htdocs/bookmarks/admin/bookmark.php b/htdocs/bookmarks/admin/bookmark.php index bd249055773..b622aa1d9dd 100644 --- a/htdocs/bookmarks/admin/bookmark.php +++ b/htdocs/bookmarks/admin/bookmark.php @@ -82,6 +82,5 @@ print '
'; -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/cashdesk/admin/cashdesk.php b/htdocs/cashdesk/admin/cashdesk.php index c9b6804ef33..de60e8b80cf 100644 --- a/htdocs/cashdesk/admin/cashdesk.php +++ b/htdocs/cashdesk/admin/cashdesk.php @@ -188,6 +188,5 @@ print '
\n"; -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/categories/admin/categorie.php b/htdocs/categories/admin/categorie.php index 12b4d3ced81..d1af6bdafb2 100644 --- a/htdocs/categories/admin/categorie.php +++ b/htdocs/categories/admin/categorie.php @@ -121,5 +121,5 @@ print ''; print ''; -$db->close(); -llxFooter(); \ No newline at end of file +llxFooter(); +$db->close(); \ No newline at end of file diff --git a/htdocs/comm/action/info.php b/htdocs/comm/action/info.php index 93881b35564..7c2001d925d 100644 --- a/htdocs/comm/action/info.php +++ b/htdocs/comm/action/info.php @@ -64,6 +64,5 @@ print ''; print '
'; -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/comm/action/rapport/index.php b/htdocs/comm/action/rapport/index.php index 066df5fb39e..21e85c89756 100644 --- a/htdocs/comm/action/rapport/index.php +++ b/htdocs/comm/action/rapport/index.php @@ -150,7 +150,5 @@ else dol_print_error($db); } - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/comm/mailing/info.php b/htdocs/comm/mailing/info.php index bbd10849f42..77245f74766 100644 --- a/htdocs/comm/mailing/info.php +++ b/htdocs/comm/mailing/info.php @@ -63,6 +63,5 @@ if ($mil->fetch($_REQUEST["id"]) >= 0) print ''; } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/comm/multiprix.php b/htdocs/comm/multiprix.php index 6f8c0b70b86..645bdc580b4 100644 --- a/htdocs/comm/multiprix.php +++ b/htdocs/comm/multiprix.php @@ -171,6 +171,5 @@ if ($_socid > 0) } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/comm/prospect/recap-prospect.php b/htdocs/comm/prospect/recap-prospect.php index 5d7358a806e..fe0fdc55b58 100644 --- a/htdocs/comm/prospect/recap-prospect.php +++ b/htdocs/comm/prospect/recap-prospect.php @@ -89,7 +89,5 @@ else dol_print_error($db); } - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/comm/recap-client.php b/htdocs/comm/recap-client.php index 405ca2d4a11..71add817dc5 100644 --- a/htdocs/comm/recap-client.php +++ b/htdocs/comm/recap-client.php @@ -88,7 +88,5 @@ else dol_print_error($db); } - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/comm/remise.php b/htdocs/comm/remise.php index 0edcdcd0c1d..a08e0a66a6f 100644 --- a/htdocs/comm/remise.php +++ b/htdocs/comm/remise.php @@ -199,6 +199,5 @@ if ($socid > 0) } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/comm/remx.php b/htdocs/comm/remx.php index ba85d593fce..07989b457de 100644 --- a/htdocs/comm/remx.php +++ b/htdocs/comm/remx.php @@ -544,6 +544,5 @@ if ($socid > 0) } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/commande/info.php b/htdocs/commande/info.php index bae932857fe..ae0dd789064 100644 --- a/htdocs/commande/info.php +++ b/htdocs/commande/info.php @@ -62,7 +62,5 @@ print ''; print ''; - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/bank/bilan.php b/htdocs/compta/bank/bilan.php index 7e44778b9bd..c1d668df8d7 100644 --- a/htdocs/compta/bank/bilan.php +++ b/htdocs/compta/bank/bilan.php @@ -89,6 +89,5 @@ print "".$langs->trans("BankBalance").""; -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/bank/budget.php b/htdocs/compta/bank/budget.php index c35dec41e7d..666ad0085e1 100644 --- a/htdocs/compta/bank/budget.php +++ b/htdocs/compta/bank/budget.php @@ -97,6 +97,5 @@ else } print ""; -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/bank/card.php b/htdocs/compta/bank/card.php index fb8383cd91a..dbe0722c77d 100644 --- a/htdocs/compta/bank/card.php +++ b/htdocs/compta/bank/card.php @@ -1041,8 +1041,5 @@ else } - - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/bank/info.php b/htdocs/compta/bank/info.php index cfc0c10d0a5..a1952ab5957 100644 --- a/htdocs/compta/bank/info.php +++ b/htdocs/compta/bank/info.php @@ -62,7 +62,5 @@ print ''; print ''; - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/bank/search.php b/htdocs/compta/bank/search.php index 0fd5336af7e..5bdca142a91 100644 --- a/htdocs/compta/bank/search.php +++ b/htdocs/compta/bank/search.php @@ -353,7 +353,5 @@ if ($_POST["action"] == "search" && ! $num) print $langs->trans("NoRecordFound"); } - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/bank/treso.php b/htdocs/compta/bank/treso.php index cbdb769789f..db7f37cb3e5 100644 --- a/htdocs/compta/bank/treso.php +++ b/htdocs/compta/bank/treso.php @@ -339,6 +339,5 @@ else print $langs->trans("ErrorBankAccountNotFound"); } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/bank/virement.php b/htdocs/compta/bank/virement.php index 4e323893d85..1a3294a2f15 100644 --- a/htdocs/compta/bank/virement.php +++ b/htdocs/compta/bank/virement.php @@ -188,6 +188,5 @@ print '
"; -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/clients.php b/htdocs/compta/clients.php index 14751d308c4..6c2d9023902 100644 --- a/htdocs/compta/clients.php +++ b/htdocs/compta/clients.php @@ -210,6 +210,5 @@ else dol_print_error($db); } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/deplacement/info.php b/htdocs/compta/deplacement/info.php index dcdc8c9baf0..1e0279263e3 100644 --- a/htdocs/compta/deplacement/info.php +++ b/htdocs/compta/deplacement/info.php @@ -58,6 +58,5 @@ if ($id) print '
'; } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/facture/info.php b/htdocs/compta/facture/info.php index 8611381d486..24164b5709a 100644 --- a/htdocs/compta/facture/info.php +++ b/htdocs/compta/facture/info.php @@ -54,6 +54,5 @@ print ''; print ''; -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/localtax/card.php b/htdocs/compta/localtax/card.php index b5140c54842..aded1c6aa1f 100644 --- a/htdocs/compta/localtax/card.php +++ b/htdocs/compta/localtax/card.php @@ -269,8 +269,6 @@ if ($id) print ""; } - +llxFooter(); $db->close(); -llxFooter(); - diff --git a/htdocs/compta/localtax/clients.php b/htdocs/compta/localtax/clients.php index 31eaf4375c3..ac30e529839 100644 --- a/htdocs/compta/localtax/clients.php +++ b/htdocs/compta/localtax/clients.php @@ -318,7 +318,5 @@ if($conf->global->$calc ==0){ } print ''; - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/localtax/index.php b/htdocs/compta/localtax/index.php index c3512fdcc1e..3bed627402e 100644 --- a/htdocs/compta/localtax/index.php +++ b/htdocs/compta/localtax/index.php @@ -280,6 +280,5 @@ print ''; print ''; print ''; -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/localtax/quadri_detail.php b/htdocs/compta/localtax/quadri_detail.php index 0e88980796b..7c1e99b3537 100644 --- a/htdocs/compta/localtax/quadri_detail.php +++ b/htdocs/compta/localtax/quadri_detail.php @@ -663,6 +663,5 @@ else $i++; } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/localtax/reglement.php b/htdocs/compta/localtax/reglement.php index bfe0cb828c0..54530b14443 100644 --- a/htdocs/compta/localtax/reglement.php +++ b/htdocs/compta/localtax/reglement.php @@ -92,6 +92,5 @@ else dol_print_error($db); } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/paiement/avalider.php b/htdocs/compta/paiement/avalider.php index 489997011b0..6a891b72bda 100644 --- a/htdocs/compta/paiement/avalider.php +++ b/htdocs/compta/paiement/avalider.php @@ -118,6 +118,5 @@ if ($resql) print ""; } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/paiement/index.php b/htdocs/compta/paiement/index.php index 8575db70288..7f1597b5afc 100644 --- a/htdocs/compta/paiement/index.php +++ b/htdocs/compta/paiement/index.php @@ -31,8 +31,5 @@ llxHeader(); print load_fiche_titre("Payments"); - - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/paiement/info.php b/htdocs/compta/paiement/info.php index 84ef52c3a80..143ef55e987 100644 --- a/htdocs/compta/paiement/info.php +++ b/htdocs/compta/paiement/info.php @@ -63,6 +63,5 @@ print ''; print ''; -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/paiement_charge.php b/htdocs/compta/paiement_charge.php index 30a3d17ab3f..a68f3445305 100644 --- a/htdocs/compta/paiement_charge.php +++ b/htdocs/compta/paiement_charge.php @@ -323,7 +323,5 @@ if ($_GET["action"] == 'create') print "\n"; } - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/prelevement/create.php b/htdocs/compta/prelevement/create.php index 7e81e181d11..7fd5cb10483 100644 --- a/htdocs/compta/prelevement/create.php +++ b/htdocs/compta/prelevement/create.php @@ -299,7 +299,5 @@ else dol_print_error($db); } - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/prelevement/demandes.php b/htdocs/compta/prelevement/demandes.php index 364e073676b..22679af2110 100644 --- a/htdocs/compta/prelevement/demandes.php +++ b/htdocs/compta/prelevement/demandes.php @@ -157,5 +157,5 @@ else dol_print_error($db); } - llxFooter(); +$db->close(); diff --git a/htdocs/compta/prelevement/fiche-rejet.php b/htdocs/compta/prelevement/fiche-rejet.php index 161227aa121..d520abccbcf 100644 --- a/htdocs/compta/prelevement/fiche-rejet.php +++ b/htdocs/compta/prelevement/fiche-rejet.php @@ -178,6 +178,5 @@ else dol_print_error($db); } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/prelevement/fiche-stat.php b/htdocs/compta/prelevement/fiche-stat.php index 83de06bc13c..c2316578130 100644 --- a/htdocs/compta/prelevement/fiche-stat.php +++ b/htdocs/compta/prelevement/fiche-stat.php @@ -159,6 +159,5 @@ if ($prev_id) } } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/prelevement/list.php b/htdocs/compta/prelevement/list.php index 9274a885105..d0c6792a785 100644 --- a/htdocs/compta/prelevement/list.php +++ b/htdocs/compta/prelevement/list.php @@ -192,7 +192,5 @@ else dol_print_error($db); } -$db->close(); - - llxFooter(); +$db->close(); diff --git a/htdocs/compta/prelevement/rejets.php b/htdocs/compta/prelevement/rejets.php index 30eafa40efa..78a11e898df 100644 --- a/htdocs/compta/prelevement/rejets.php +++ b/htdocs/compta/prelevement/rejets.php @@ -124,6 +124,5 @@ else dol_print_error($db); } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/sociales/index.php b/htdocs/compta/sociales/index.php index 639bf51fefd..6df15c9ba8e 100644 --- a/htdocs/compta/sociales/index.php +++ b/htdocs/compta/sociales/index.php @@ -247,9 +247,5 @@ else dol_print_error($db); } - - - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/tva/card.php b/htdocs/compta/tva/card.php index ed80ee21a4e..674e800a168 100644 --- a/htdocs/compta/tva/card.php +++ b/htdocs/compta/tva/card.php @@ -372,7 +372,5 @@ if ($id) print ""; } - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/tva/index.php b/htdocs/compta/tva/index.php index a5f45d0c72c..6445eb09f02 100644 --- a/htdocs/compta/tva/index.php +++ b/htdocs/compta/tva/index.php @@ -252,7 +252,5 @@ print ""; print ''; print ''; - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/tva/quadri.php b/htdocs/compta/tva/quadri.php index a8434a70868..0e4a66146aa 100644 --- a/htdocs/compta/tva/quadri.php +++ b/htdocs/compta/tva/quadri.php @@ -313,7 +313,5 @@ print ''; echo ''; echo ''; - -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/tva/quadri_detail.php b/htdocs/compta/tva/quadri_detail.php index cedc38a2143..8175744a75d 100644 --- a/htdocs/compta/tva/quadri_detail.php +++ b/htdocs/compta/tva/quadri_detail.php @@ -638,6 +638,5 @@ else } echo ''; -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/tva/quarter_report.php b/htdocs/compta/tva/quarter_report.php index e906b65ed4f..61d019894e8 100644 --- a/htdocs/compta/tva/quarter_report.php +++ b/htdocs/compta/tva/quarter_report.php @@ -707,6 +707,5 @@ if (!is_array($x_coll) || !is_array($x_paye)) { } print ''; -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/ventilation/card.php b/htdocs/compta/ventilation/card.php index 463f8884242..59ed7fe9cde 100644 --- a/htdocs/compta/ventilation/card.php +++ b/htdocs/compta/ventilation/card.php @@ -160,6 +160,5 @@ else print "Error ID incorrect"; } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/ventilation/fournisseur/card.php b/htdocs/compta/ventilation/fournisseur/card.php index 9c69b613697..dc376de7c06 100644 --- a/htdocs/compta/ventilation/fournisseur/card.php +++ b/htdocs/compta/ventilation/fournisseur/card.php @@ -144,6 +144,5 @@ else print "Error ID incorrect"; } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/compta/ventilation/fournisseur/list.php b/htdocs/compta/ventilation/fournisseur/list.php index 5213a4686be..888f9152240 100644 --- a/htdocs/compta/ventilation/fournisseur/list.php +++ b/htdocs/compta/ventilation/fournisseur/list.php @@ -100,6 +100,6 @@ else { print $db->error(); } -$db->close(); llxFooter(); +$db->close(); diff --git a/htdocs/contrat/info.php b/htdocs/contrat/info.php index 53af58a2415..2067247dbf6 100644 --- a/htdocs/contrat/info.php +++ b/htdocs/contrat/info.php @@ -55,6 +55,5 @@ print ''; print ''; -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/cron/info.php b/htdocs/cron/info.php index 1e13bd725b3..334a5da6890 100644 --- a/htdocs/cron/info.php +++ b/htdocs/cron/info.php @@ -55,6 +55,5 @@ dol_print_object_info($object); print ''; print ''; - -$db->close(); -llxFooter(); \ No newline at end of file +llxFooter(); +$db->close(); \ No newline at end of file From 793e6e2a8f25472ed96462876b1650c2592ba678 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 11 Dec 2015 16:56:25 +0100 Subject: [PATCH 190/206] Example mut be excluded of packages --- build/makepack-dolibarr.pl | 2 + .../phpoffice/phpexcel/Examples/.gitignore | 3 - .../phpexcel/Examples/01pharSimple.php | 112 --- .../Examples/01simple-download-ods.php | 89 --- .../Examples/01simple-download-pdf.php | 104 --- .../Examples/01simple-download-xls.php | 89 --- .../Examples/01simple-download-xlsx.php | 89 --- .../phpoffice/phpexcel/Examples/01simple.php | 118 --- .../phpexcel/Examples/01simplePCLZip.php | 106 --- .../phpexcel/Examples/02types-xls.php | 183 ----- .../phpoffice/phpexcel/Examples/02types.php | 183 ----- .../phpexcel/Examples/03formulas.php | 149 ---- .../phpexcel/Examples/04printing.php | 125 ---- .../phpexcel/Examples/05featuredemo.inc.php | 394 ---------- .../phpexcel/Examples/05featuredemo.php | 78 -- .../06largescale-with-cellcaching-sqlite.php | 129 ---- .../06largescale-with-cellcaching-sqlite3.php | 129 ---- .../06largescale-with-cellcaching.php | 128 ---- .../phpexcel/Examples/06largescale-xls.php | 136 ---- .../phpexcel/Examples/06largescale.php | 136 ---- .../phpoffice/phpexcel/Examples/07reader.php | 76 -- .../phpexcel/Examples/07readerPCLZip.php | 79 -- .../Examples/08conditionalformatting.php | 189 ----- .../Examples/08conditionalformatting2.php | 136 ---- .../phpexcel/Examples/09pagebreaks.php | 134 ---- .../Examples/10autofilter-selection-1.php | 221 ------ .../Examples/10autofilter-selection-2.php | 213 ------ .../10autofilter-selection-display.php | 198 ----- .../phpexcel/Examples/10autofilter.php | 171 ----- .../Examples/11documentsecurity-xls.php | 109 --- .../phpexcel/Examples/11documentsecurity.php | 109 --- .../phpexcel/Examples/12cellProtection.php | 107 --- .../phpexcel/Examples/13calculation.php | 235 ------ .../phpoffice/phpexcel/Examples/14excel5.php | 63 -- .../Examples/15datavalidation-xls.php | 142 ---- .../phpexcel/Examples/15datavalidation.php | 143 ---- .../phpoffice/phpexcel/Examples/16csv.php | 107 --- .../phpoffice/phpexcel/Examples/17html.php | 64 -- .../Examples/18extendedcalculation.php | 108 --- .../phpexcel/Examples/19namedrange.php | 129 ---- .../phpexcel/Examples/20readexcel5.php | 79 -- .../phpoffice/phpexcel/Examples/21pdf.php | 94 --- .../phpexcel/Examples/22heavilyformatted.php | 116 --- .../phpexcel/Examples/23sharedstyles.php | 124 ---- .../phpexcel/Examples/24readfilter.php | 77 -- .../phpexcel/Examples/25inmemoryimage.php | 83 --- .../phpoffice/phpexcel/Examples/26utf8.php | 122 --- .../phpexcel/Examples/27imagesexcel5.php | 64 -- .../phpexcel/Examples/28iterator.php | 68 -- .../Examples/29advancedvaluebinder.php | 183 ----- .../phpexcel/Examples/30template.php | 91 --- .../Examples/31docproperties_write-xls.php | 119 --- .../Examples/31docproperties_write.php | 119 --- .../phpexcel/Examples/32chartreadwrite.php | 131 ---- .../phpexcel/Examples/33chartcreate-area.php | 142 ---- .../Examples/33chartcreate-bar-stacked.php | 145 ---- .../phpexcel/Examples/33chartcreate-bar.php | 145 ---- .../Examples/33chartcreate-column-2.php | 154 ---- .../Examples/33chartcreate-column.php | 145 ---- .../Examples/33chartcreate-composite.php | 203 ----- .../phpexcel/Examples/33chartcreate-line.php | 142 ---- .../33chartcreate-multiple-charts.php | 220 ------ .../phpexcel/Examples/33chartcreate-pie.php | 215 ------ .../phpexcel/Examples/33chartcreate-radar.php | 154 ---- .../Examples/33chartcreate-scatter.php | 138 ---- .../phpexcel/Examples/33chartcreate-stock.php | 151 ---- .../phpexcel/Examples/34chartupdate.php | 78 -- .../phpexcel/Examples/35chartrender.php | 134 ---- .../Examples/36chartreadwriteHTML.php | 151 ---- .../phpexcel/Examples/36chartreadwritePDF.php | 174 ----- .../phpexcel/Examples/37page_layout_view.php | 83 --- .../phpexcel/Examples/38cloneWorksheet.php | 118 --- .../phpexcel/Examples/39dropdown.php | 175 ----- .../phpexcel/Examples/40duplicateStyle.php | 51 -- .../phpexcel/Examples/41password.php | 84 --- .../phpexcel/Examples/42richText.php | 159 ---- .../phpexcel/Examples/Excel2003XMLReader.php | 61 -- .../phpexcel/Examples/Excel2003XMLTest.xml | 1 - .../phpexcel/Examples/GnumericReader.php | 60 -- .../phpexcel/Examples/GnumericTest.gnumeric | Bin 7823 -> 0 bytes .../phpexcel/Examples/OOCalcReader.php | 61 -- .../phpexcel/Examples/OOCalcReaderPCLZip.php | 64 -- .../phpexcel/Examples/OOCalcTest.ods | Bin 17931 -> 0 bytes .../phpoffice/phpexcel/Examples/Quadratic.php | 68 -- .../phpexcel/Examples/Quadratic2.php | 65 -- .../phpexcel/Examples/SylkReader.php | 50 -- .../phpoffice/phpexcel/Examples/SylkTest.slk | 152 ---- .../phpoffice/phpexcel/Examples/XMLReader.php | 60 -- .../phpoffice/phpexcel/Examples/XMLTest.xml | 450 ----------- .../Examples/data/continents/Africa.txt | 54 -- .../Examples/data/continents/Asia.txt | 44 -- .../Examples/data/continents/Europe.txt | 47 -- .../data/continents/North America.txt | 23 - .../Examples/data/continents/Oceania.txt | 14 - .../data/continents/South America.txt | 12 - .../phpexcel/Examples/images/officelogo.jpg | Bin 5597 -> 0 bytes .../phpexcel/Examples/images/paid.png | Bin 1605 -> 0 bytes .../Examples/images/phpexcel_logo.gif | Bin 6104 -> 0 bytes .../Examples/images/termsconditions.jpg | Bin 528 -> 0 bytes .../phpoffice/phpexcel/Examples/runall.php | 130 ---- .../Classes/PHPExcel/AutoloaderTest.php | 56 -- .../PHPExcel/Calculation/DateTimeTest.php | 466 ------------ .../PHPExcel/Calculation/EngineeringTest.php | 698 ------------------ .../PHPExcel/Calculation/FinancialTest.php | 516 ------------- .../PHPExcel/Calculation/FunctionsTest.php | 276 ------- .../PHPExcel/Calculation/LogicalTest.php | 112 --- .../PHPExcel/Calculation/LookupRefTest.php | 52 -- .../PHPExcel/Calculation/MathTrigTest.php | 560 -------------- .../PHPExcel/Calculation/TextDataTest.php | 365 --------- .../Classes/PHPExcel/CalculationTest.php | 37 - .../PHPExcel/Cell/AdvancedValueBinderTest.php | 73 -- .../Classes/PHPExcel/Cell/DataTypeTest.php | 24 - .../PHPExcel/Cell/DefaultValueBinderTest.php | 85 --- .../Classes/PHPExcel/Cell/HyperlinkTest.php | 88 --- .../unitTests/Classes/PHPExcel/CellTest.php | 295 -------- .../PHPExcel/Chart/DataSeriesValuesTest.php | 55 -- .../Classes/PHPExcel/Chart/LayoutTest.php | 37 - .../Classes/PHPExcel/Chart/LegendTest.php | 134 ---- .../PHPExcel/Reader/XEEValidatorTest.php | 55 -- .../Classes/PHPExcel/ReferenceHelperTest.php | 58 -- .../Classes/PHPExcel/Shared/CodePageTest.php | 57 -- .../Classes/PHPExcel/Shared/DateTest.php | 188 ----- .../Classes/PHPExcel/Shared/FileTest.php | 39 - .../Classes/PHPExcel/Shared/FontTest.php | 94 --- .../PHPExcel/Shared/PasswordHasherTest.php | 33 - .../Classes/PHPExcel/Shared/StringTest.php | 83 --- .../Classes/PHPExcel/Shared/TimeZoneTest.php | 39 - .../Classes/PHPExcel/Style/ColorTest.php | 81 -- .../PHPExcel/Style/NumberFormatTest.php | 36 - .../Worksheet/AutoFilter/Column/RuleTest.php | 109 --- .../Worksheet/AutoFilter/ColumnTest.php | 173 ----- .../PHPExcel/Worksheet/AutoFilterTest.php | 340 --------- .../PHPExcel/Worksheet/CellCollectionTest.php | 31 - .../Worksheet/ColumnCellIteratorTest.php | 87 --- .../PHPExcel/Worksheet/ColumnIteratorTest.php | 89 --- .../Worksheet/RowCellIteratorTest.php | 89 --- .../PHPExcel/Worksheet/RowIteratorTest.php | 87 --- .../Worksheet/WorksheetColumnTest.php | 46 -- .../PHPExcel/Worksheet/WorksheetRowTest.php | 46 -- .../phpexcel/unitTests/bootstrap.php | 49 -- .../phpexcel/unitTests/custom/Complex.php | 114 --- .../unitTests/custom/complexAssert.php | 62 -- .../phpexcel/unitTests/phpunit-cc.xml | 40 - .../phpoffice/phpexcel/unitTests/phpunit.xml | 32 - .../Calculation/DateTime/DATE.data | 79 -- .../Calculation/DateTime/DATEDIF.data | 96 --- .../Calculation/DateTime/DATEVALUE.data | 66 -- .../rawTestData/Calculation/DateTime/DAY.data | 8 - .../Calculation/DateTime/DAYS360.data | 34 - .../Calculation/DateTime/EDATE.data | 15 - .../Calculation/DateTime/EOMONTH.data | 17 - .../Calculation/DateTime/HOUR.data | 12 - .../Calculation/DateTime/MINUTE.data | 12 - .../Calculation/DateTime/MONTH.data | 12 - .../Calculation/DateTime/NETWORKDAYS.data | 18 - .../Calculation/DateTime/SECOND.data | 12 - .../Calculation/DateTime/TIME.data | 22 - .../Calculation/DateTime/TIMEVALUE.data | 13 - .../Calculation/DateTime/WEEKDAY.data | 27 - .../Calculation/DateTime/WEEKNUM.data | 7 - .../Calculation/DateTime/WORKDAY.data | 13 - .../Calculation/DateTime/YEAR.data | 11 - .../Calculation/DateTime/YEARFRAC.data | 65 -- .../Calculation/Engineering/BESSELI.data | 59 -- .../Calculation/Engineering/BESSELJ.data | 37 - .../Calculation/Engineering/BESSELK.data | 38 - .../Calculation/Engineering/BESSELY.data | 37 - .../Calculation/Engineering/BIN2DEC.data | 10 - .../Calculation/Engineering/BIN2HEX.data | 14 - .../Calculation/Engineering/BIN2OCT.data | 15 - .../Calculation/Engineering/COMPLEX.data | 547 -------------- .../Calculation/Engineering/CONVERTUOM.data | 24 - .../Calculation/Engineering/DEC2BIN.data | 16 - .../Calculation/Engineering/DEC2HEX.data | 15 - .../Calculation/Engineering/DEC2OCT.data | 12 - .../Calculation/Engineering/DELTA.data | 25 - .../Calculation/Engineering/ERF.data | 124 ---- .../Calculation/Engineering/ERFC.data | 41 - .../Calculation/Engineering/GESTEP.data | 81 -- .../Calculation/Engineering/HEX2BIN.data | 13 - .../Calculation/Engineering/HEX2DEC.data | 13 - .../Calculation/Engineering/HEX2OCT.data | 13 - .../Calculation/Engineering/IMABS.data | 27 - .../Calculation/Engineering/IMAGINARY.data | 30 - .../Calculation/Engineering/IMARGUMENT.data | 26 - .../Calculation/Engineering/IMCONJUGATE.data | 26 - .../Calculation/Engineering/IMCOS.data | 27 - .../Calculation/Engineering/IMDIV.data | 20 - .../Calculation/Engineering/IMEXP.data | 27 - .../Calculation/Engineering/IMLN.data | 27 - .../Calculation/Engineering/IMLOG10.data | 27 - .../Calculation/Engineering/IMLOG2.data | 27 - .../Calculation/Engineering/IMPOWER.data | 18 - .../Calculation/Engineering/IMPRODUCT.data | 15 - .../Calculation/Engineering/IMREAL.data | 30 - .../Calculation/Engineering/IMSIN.data | 27 - .../Calculation/Engineering/IMSQRT.data | 28 - .../Calculation/Engineering/IMSUB.data | 10 - .../Calculation/Engineering/IMSUM.data | 10 - .../Calculation/Engineering/OCT2BIN.data | 9 - .../Calculation/Engineering/OCT2DEC.data | 9 - .../Calculation/Engineering/OCT2HEX.data | 9 - .../Calculation/Financial/ACCRINT.data | 8 - .../Calculation/Financial/ACCRINTM.data | 6 - .../Calculation/Financial/AMORDEGRC.data | 3 - .../Calculation/Financial/AMORLINC.data | 3 - .../Calculation/Financial/COUPDAYBS.data | 6 - .../Calculation/Financial/COUPDAYS.data | 6 - .../Calculation/Financial/COUPDAYSNC.data | 6 - .../Calculation/Financial/COUPNCD.data | 6 - .../Calculation/Financial/COUPNUM.data | 7 - .../Calculation/Financial/COUPPCD.data | 6 - .../Calculation/Financial/CUMIPMT.data | 10 - .../Calculation/Financial/CUMPRINC.data | 10 - .../rawTestData/Calculation/Financial/DB.data | 17 - .../Calculation/Financial/DDB.data | 16 - .../Calculation/Financial/DISC.data | 6 - .../Calculation/Financial/DOLLARDE.data | 10 - .../Calculation/Financial/DOLLARFR.data | 10 - .../Calculation/Financial/EFFECT.data | 6 - .../rawTestData/Calculation/Financial/FV.data | 9 - .../Calculation/Financial/FVSCHEDULE.data | 4 - .../Calculation/Financial/INTRATE.data | 6 - .../Calculation/Financial/IPMT.data | 9 - .../Calculation/Financial/IRR.data | 6 - .../Calculation/Financial/ISPMT.data | 5 - .../Calculation/Financial/MIRR.data | 6 - .../Calculation/Financial/NOMINAL.data | 6 - .../Calculation/Financial/NPER.data | 10 - .../Calculation/Financial/NPV.data | 5 - .../Calculation/Financial/PRICE.data | 10 - .../Calculation/Financial/RATE.data | 11 - .../Calculation/Financial/XIRR.data | 4 - .../Calculation/Functions/ERROR_TYPE.data | 14 - .../Calculation/Functions/IS_BLANK.data | 16 - .../Calculation/Functions/IS_ERR.data | 16 - .../Calculation/Functions/IS_ERROR.data | 16 - .../Calculation/Functions/IS_EVEN.data | 20 - .../Calculation/Functions/IS_LOGICAL.data | 16 - .../Calculation/Functions/IS_NA.data | 16 - .../Calculation/Functions/IS_NONTEXT.data | 16 - .../Calculation/Functions/IS_NUMBER.data | 16 - .../Calculation/Functions/IS_ODD.data | 20 - .../Calculation/Functions/IS_TEXT.data | 16 - .../rawTestData/Calculation/Functions/N.data | 20 - .../Calculation/Functions/TYPE.data | 16 - .../rawTestData/Calculation/Logical/AND.data | 21 - .../rawTestData/Calculation/Logical/IF.data | 7 - .../Calculation/Logical/IFERROR.data | 8 - .../rawTestData/Calculation/Logical/NOT.data | 20 - .../rawTestData/Calculation/Logical/OR.data | 20 - .../Calculation/LookupRef/HLOOKUP.data | 9 - .../Calculation/LookupRef/VLOOKUP.data | 5 - .../Calculation/MathTrig/ATAN2.data | 17 - .../Calculation/MathTrig/CEILING.data | 21 - .../Calculation/MathTrig/COMBIN.data | 25 - .../Calculation/MathTrig/EVEN.data | 17 - .../Calculation/MathTrig/FACT.data | 10 - .../Calculation/MathTrig/FACTDOUBLE.data | 8 - .../Calculation/MathTrig/FLOOR.data | 11 - .../rawTestData/Calculation/MathTrig/GCD.data | 20 - .../rawTestData/Calculation/MathTrig/INT.data | 19 - .../rawTestData/Calculation/MathTrig/LCM.data | 12 - .../rawTestData/Calculation/MathTrig/LOG.data | 70 -- .../Calculation/MathTrig/MDETERM.data | 14 - .../Calculation/MathTrig/MINVERSE.data | 15 - .../Calculation/MathTrig/MMULT.data | 12 - .../rawTestData/Calculation/MathTrig/MOD.data | 9 - .../Calculation/MathTrig/MROUND.data | 11 - .../Calculation/MathTrig/MULTINOMIAL.data | 2 - .../rawTestData/Calculation/MathTrig/ODD.data | 13 - .../Calculation/MathTrig/POWER.data | 81 -- .../Calculation/MathTrig/PRODUCT.data | 7 - .../Calculation/MathTrig/QUOTIENT.data | 6 - .../Calculation/MathTrig/ROMAN.data | 5 - .../Calculation/MathTrig/ROUNDDOWN.data | 14 - .../Calculation/MathTrig/ROUNDUP.data | 14 - .../Calculation/MathTrig/SERIESSUM.data | 2 - .../Calculation/MathTrig/SIGN.data | 13 - .../Calculation/MathTrig/SQRTPI.data | 15 - .../Calculation/MathTrig/SUMSQ.data | 7 - .../Calculation/MathTrig/TRUNC.data | 19 - .../Calculation/TextData/CHAR.data | 5 - .../Calculation/TextData/CLEAN.data | 5 - .../Calculation/TextData/CODE.data | 12 - .../Calculation/TextData/CONCATENATE.data | 3 - .../Calculation/TextData/DOLLAR.data | 6 - .../Calculation/TextData/FIND.data | 13 - .../Calculation/TextData/FIXED.data | 5 - .../Calculation/TextData/LEFT.data | 6 - .../rawTestData/Calculation/TextData/LEN.data | 6 - .../Calculation/TextData/LOWER.data | 4 - .../rawTestData/Calculation/TextData/MID.data | 9 - .../Calculation/TextData/PROPER.data | 3 - .../Calculation/TextData/REPLACE.data | 4 - .../Calculation/TextData/RIGHT.data | 6 - .../Calculation/TextData/SEARCH.data | 11 - .../Calculation/TextData/SUBSTITUTE.data | 4 - .../rawTestData/Calculation/TextData/T.data | 5 - .../Calculation/TextData/TEXT.data | 13 - .../Calculation/TextData/TRIM.data | 7 - .../Calculation/TextData/UPPER.data | 4 - .../Calculation/TextData/VALUE.data | 10 - .../CalculationBinaryComparisonOperation.data | 53 -- .../rawTestData/Cell/DefaultValueBinder.data | 19 - .../rawTestData/CellAbsoluteCoordinate.data | 12 - .../rawTestData/CellAbsoluteReference.data | 16 - .../unitTests/rawTestData/CellBuildRange.data | 2 - .../rawTestData/CellCoordinates.data | 6 - .../CellExtractAllCellReferencesInRange.data | 9 - .../rawTestData/CellGetRangeBoundaries.data | 2 - .../rawTestData/CellRangeBoundaries.data | 2 - .../rawTestData/CellRangeDimension.data | 2 - .../unitTests/rawTestData/CellSplitRange.data | 3 - .../unitTests/rawTestData/ColumnIndex.data | 9 - .../unitTests/rawTestData/ColumnString.data | 9 - .../Reader/XEETestInvalidUTF-16.xml | Bin 276 -> 0 bytes .../Reader/XEETestInvalidUTF-16BE.xml | Bin 278 -> 0 bytes .../Reader/XEETestInvalidUTF-16LE.xml | Bin 278 -> 0 bytes .../Reader/XEETestInvalidUTF-8.xml | 8 - .../rawTestData/Reader/XEETestValidUTF-16.xml | Bin 176 -> 0 bytes .../Reader/XEETestValidUTF-16BE.xml | Bin 178 -> 0 bytes .../Reader/XEETestValidUTF-16LE.xml | Bin 178 -> 0 bytes .../rawTestData/Reader/XEETestValidUTF-8.xml | 4 - .../Shared/CentimeterSizeToPixels.data | 5 - .../rawTestData/Shared/CodePage.data | 43 -- .../Shared/DateTimeExcelToPHP1900.data | 15 - .../DateTimeExcelToPHP1900Timezone.data | 23 - .../Shared/DateTimeExcelToPHP1904.data | 10 - .../Shared/DateTimeFormatCodes.data | 37 - .../DateTimeFormattedPHPToExcel1900.data | 12 - .../Shared/DateTimePHPToExcel1900.data | 12 - .../Shared/DateTimePHPToExcel1904.data | 7 - .../rawTestData/Shared/FontSizeToPixels.data | 16 - .../rawTestData/Shared/InchSizeToPixels.data | 5 - .../rawTestData/Shared/PasswordHashes.data | 9 - .../Style/ColorChangeBrightness.data | 14 - .../rawTestData/Style/ColorGetBlue.data | 6 - .../rawTestData/Style/ColorGetGreen.data | 6 - .../rawTestData/Style/ColorGetRed.data | 6 - .../rawTestData/Style/NumberFormat.data | 37 - .../unitTests/testDataFileIterator.php | 131 ---- 342 files changed, 2 insertions(+), 21169 deletions(-) delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/.gitignore delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/01pharSimple.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-ods.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-pdf.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-xls.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-xlsx.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/01simple.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/01simplePCLZip.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/02types-xls.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/02types.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/03formulas.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/04printing.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/05featuredemo.inc.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/05featuredemo.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/06largescale-with-cellcaching-sqlite.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/06largescale-with-cellcaching-sqlite3.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/06largescale-with-cellcaching.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/06largescale-xls.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/06largescale.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/07reader.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/07readerPCLZip.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/08conditionalformatting.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/08conditionalformatting2.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/09pagebreaks.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/10autofilter-selection-1.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/10autofilter-selection-2.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/10autofilter-selection-display.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/10autofilter.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/11documentsecurity-xls.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/11documentsecurity.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/12cellProtection.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/13calculation.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/14excel5.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/15datavalidation-xls.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/15datavalidation.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/16csv.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/17html.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/18extendedcalculation.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/19namedrange.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/20readexcel5.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/21pdf.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/22heavilyformatted.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/23sharedstyles.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/24readfilter.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/25inmemoryimage.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/26utf8.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/27imagesexcel5.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/28iterator.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/29advancedvaluebinder.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/30template.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/31docproperties_write-xls.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/31docproperties_write.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/32chartreadwrite.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-area.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-bar-stacked.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-bar.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-column-2.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-column.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-composite.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-line.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-multiple-charts.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-pie.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-radar.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-scatter.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-stock.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/34chartupdate.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/35chartrender.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/36chartreadwriteHTML.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/36chartreadwritePDF.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/37page_layout_view.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/38cloneWorksheet.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/39dropdown.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/40duplicateStyle.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/41password.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/42richText.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/Excel2003XMLReader.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/Excel2003XMLTest.xml delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/GnumericReader.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/GnumericTest.gnumeric delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/OOCalcReader.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/OOCalcReaderPCLZip.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/OOCalcTest.ods delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/Quadratic.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/Quadratic2.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/SylkReader.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/SylkTest.slk delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/XMLReader.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/XMLTest.xml delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/data/continents/Africa.txt delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/data/continents/Asia.txt delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/data/continents/Europe.txt delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/data/continents/North America.txt delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/data/continents/Oceania.txt delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/data/continents/South America.txt delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/images/officelogo.jpg delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/images/paid.png delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/images/phpexcel_logo.gif delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/images/termsconditions.jpg delete mode 100644 htdocs/includes/phpoffice/phpexcel/Examples/runall.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/AutoloaderTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Calculation/DateTimeTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Calculation/EngineeringTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Calculation/FinancialTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Calculation/FunctionsTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Calculation/LogicalTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Calculation/LookupRefTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Calculation/MathTrigTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Calculation/TextDataTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/CalculationTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Cell/AdvancedValueBinderTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Cell/DataTypeTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Cell/DefaultValueBinderTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Cell/HyperlinkTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/CellTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Chart/DataSeriesValuesTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Chart/LayoutTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Chart/LegendTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Reader/XEEValidatorTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/ReferenceHelperTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Shared/CodePageTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Shared/DateTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Shared/FileTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Shared/FontTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Shared/PasswordHasherTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Shared/StringTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Shared/TimeZoneTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Style/ColorTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Style/NumberFormatTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Worksheet/AutoFilter/Column/RuleTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Worksheet/AutoFilter/ColumnTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Worksheet/AutoFilterTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Worksheet/CellCollectionTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Worksheet/ColumnCellIteratorTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Worksheet/ColumnIteratorTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Worksheet/RowCellIteratorTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Worksheet/RowIteratorTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Worksheet/WorksheetColumnTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/Classes/PHPExcel/Worksheet/WorksheetRowTest.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/bootstrap.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/custom/Complex.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/custom/complexAssert.php delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/phpunit-cc.xml delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/phpunit.xml delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/DATE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/DATEDIF.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/DATEVALUE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/DAY.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/DAYS360.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/EDATE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/EOMONTH.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/HOUR.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/MINUTE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/MONTH.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/NETWORKDAYS.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/SECOND.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/TIME.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/TIMEVALUE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/WEEKDAY.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/WEEKNUM.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/WORKDAY.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/YEAR.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/DateTime/YEARFRAC.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/BESSELI.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/BESSELJ.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/BESSELK.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/BESSELY.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/BIN2DEC.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/BIN2HEX.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/BIN2OCT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/COMPLEX.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/CONVERTUOM.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/DEC2BIN.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/DEC2HEX.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/DEC2OCT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/DELTA.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/ERF.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/ERFC.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/GESTEP.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/HEX2BIN.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/HEX2DEC.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/HEX2OCT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMABS.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMAGINARY.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMARGUMENT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMCONJUGATE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMCOS.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMDIV.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMEXP.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMLN.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMLOG10.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMLOG2.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMPOWER.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMPRODUCT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMREAL.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMSIN.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMSQRT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMSUB.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/IMSUM.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/OCT2BIN.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/OCT2DEC.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Engineering/OCT2HEX.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/ACCRINT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/ACCRINTM.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/AMORDEGRC.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/AMORLINC.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/COUPDAYBS.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/COUPDAYS.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/COUPDAYSNC.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/COUPNCD.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/COUPNUM.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/COUPPCD.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/CUMIPMT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/CUMPRINC.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/DB.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/DDB.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/DISC.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/DOLLARDE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/DOLLARFR.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/EFFECT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/FV.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/FVSCHEDULE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/INTRATE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/IPMT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/IRR.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/ISPMT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/MIRR.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/NOMINAL.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/NPER.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/NPV.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/PRICE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/RATE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Financial/XIRR.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Functions/ERROR_TYPE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Functions/IS_BLANK.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Functions/IS_ERR.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Functions/IS_ERROR.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Functions/IS_EVEN.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Functions/IS_LOGICAL.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Functions/IS_NA.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Functions/IS_NONTEXT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Functions/IS_NUMBER.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Functions/IS_ODD.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Functions/IS_TEXT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Functions/N.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Functions/TYPE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Logical/AND.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Logical/IF.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Logical/IFERROR.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Logical/NOT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/Logical/OR.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/LookupRef/HLOOKUP.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/LookupRef/VLOOKUP.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/ATAN2.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/CEILING.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/COMBIN.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/EVEN.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/FACT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/FACTDOUBLE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/FLOOR.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/GCD.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/INT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/LCM.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/LOG.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/MDETERM.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/MINVERSE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/MMULT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/MOD.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/MROUND.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/MULTINOMIAL.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/ODD.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/POWER.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/PRODUCT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/QUOTIENT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/ROMAN.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/ROUNDDOWN.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/ROUNDUP.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/SERIESSUM.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/SIGN.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/SQRTPI.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/SUMSQ.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/MathTrig/TRUNC.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/CHAR.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/CLEAN.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/CODE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/CONCATENATE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/DOLLAR.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/FIND.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/FIXED.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/LEFT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/LEN.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/LOWER.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/MID.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/PROPER.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/REPLACE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/RIGHT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/SEARCH.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/SUBSTITUTE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/T.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/TEXT.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/TRIM.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/UPPER.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Calculation/TextData/VALUE.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/CalculationBinaryComparisonOperation.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Cell/DefaultValueBinder.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/CellAbsoluteCoordinate.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/CellAbsoluteReference.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/CellBuildRange.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/CellCoordinates.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/CellExtractAllCellReferencesInRange.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/CellGetRangeBoundaries.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/CellRangeBoundaries.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/CellRangeDimension.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/CellSplitRange.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/ColumnIndex.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/ColumnString.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Reader/XEETestInvalidUTF-16.xml delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Reader/XEETestInvalidUTF-16BE.xml delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Reader/XEETestInvalidUTF-16LE.xml delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Reader/XEETestInvalidUTF-8.xml delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Reader/XEETestValidUTF-16.xml delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Reader/XEETestValidUTF-16BE.xml delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Reader/XEETestValidUTF-16LE.xml delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Reader/XEETestValidUTF-8.xml delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Shared/CentimeterSizeToPixels.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Shared/CodePage.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Shared/DateTimeExcelToPHP1900.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Shared/DateTimeExcelToPHP1900Timezone.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Shared/DateTimeExcelToPHP1904.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Shared/DateTimeFormatCodes.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Shared/DateTimeFormattedPHPToExcel1900.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Shared/DateTimePHPToExcel1900.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Shared/DateTimePHPToExcel1904.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Shared/FontSizeToPixels.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Shared/InchSizeToPixels.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Shared/PasswordHashes.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Style/ColorChangeBrightness.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Style/ColorGetBlue.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Style/ColorGetGreen.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Style/ColorGetRed.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/rawTestData/Style/NumberFormat.data delete mode 100644 htdocs/includes/phpoffice/phpexcel/unitTests/testDataFileIterator.php diff --git a/build/makepack-dolibarr.pl b/build/makepack-dolibarr.pl index c22c977bdf0..8fc8e49aaf8 100755 --- a/build/makepack-dolibarr.pl +++ b/build/makepack-dolibarr.pl @@ -533,8 +533,10 @@ if ($nboftargetok) { $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/phpexcel/PHPExcel/Shared/PDF`; $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/phpexcel/PHPExcel/Shared/PCLZip`; $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/phpoffice/phpexcel/license.txt`; + $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/phpoffice/phpexcel/Examples`; $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/phpoffice/phpexcel/PHPExcel/Shared/PDF`; $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/phpoffice/phpexcel/PHPExcel/Shared/PCLZip`; + $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/phpoffice/phpexcel/unitTests`; $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/tcpdf/fonts/dejavu-fonts-ttf-*`; $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/tcpdf/fonts/freefont-*`; $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/tcpdf/fonts/utils`; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/.gitignore b/htdocs/includes/phpoffice/phpexcel/Examples/.gitignore deleted file mode 100644 index 1888a98fa19..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ - -*.xls -*.xlsx \ No newline at end of file diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/01pharSimple.php b/htdocs/includes/phpoffice/phpexcel/Examples/01pharSimple.php deleted file mode 100644 index a8804770129..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/01pharSimple.php +++ /dev/null @@ -1,112 +0,0 @@ -'); - -/** Include PHPExcel */ -require_once '../Build/PHPExcel.phar'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("PHPExcel Test Document") - ->setSubject("PHPExcel Test Document") - ->setDescription("Test document for PHPExcel, generated using PHP classes.") - ->setKeywords("office PHPExcel php") - ->setCategory("Test result file"); - - -// Add some data -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A1', 'Hello') - ->setCellValue('B2', 'world!') - ->setCellValue('C1', 'Hello') - ->setCellValue('D2', 'world!'); - -// Miscellaneous glyphs, UTF-8 -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A4', 'Miscellaneous glyphs') - ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç'); - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Simple'); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Save Excel5 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-ods.php b/htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-ods.php deleted file mode 100644 index 574fb0113eb..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-ods.php +++ /dev/null @@ -1,89 +0,0 @@ -getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Add some data -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A1', 'Hello') - ->setCellValue('B2', 'world!') - ->setCellValue('C1', 'Hello') - ->setCellValue('D2', 'world!'); - -// Miscellaneous glyphs, UTF-8 -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A4', 'Miscellaneous glyphs') - ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç'); - -// Rename worksheet -$objPHPExcel->getActiveSheet()->setTitle('Simple'); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Redirect output to a client’s web browser (OpenDocument) -header('Content-Type: application/vnd.oasis.opendocument.spreadsheet'); -header('Content-Disposition: attachment;filename="01simple.ods"'); -header('Cache-Control: max-age=0'); -// If you're serving to IE 9, then the following may be needed -header('Cache-Control: max-age=1'); - -// If you're serving to IE over SSL, then the following may be needed -header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past -header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified -header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1 -header ('Pragma: public'); // HTTP/1.0 - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'OpenDocument'); -$objWriter->save('php://output'); -exit; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-pdf.php b/htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-pdf.php deleted file mode 100644 index 287b0e891bd..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-pdf.php +++ /dev/null @@ -1,104 +0,0 @@ -getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("PDF Test Document") - ->setSubject("PDF Test Document") - ->setDescription("Test document for PDF, generated using PHP classes.") - ->setKeywords("pdf php") - ->setCategory("Test result file"); - - -// Add some data -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A1', 'Hello') - ->setCellValue('B2', 'world!') - ->setCellValue('C1', 'Hello') - ->setCellValue('D2', 'world!'); - -// Miscellaneous glyphs, UTF-8 -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A4', 'Miscellaneous glyphs') - ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç'); - -// Rename worksheet -$objPHPExcel->getActiveSheet()->setTitle('Simple'); -$objPHPExcel->getActiveSheet()->setShowGridLines(false); - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -if (!PHPExcel_Settings::setPdfRenderer( - $rendererName, - $rendererLibraryPath - )) { - die( - 'NOTICE: Please set the $rendererName and $rendererLibraryPath values' . - '
' . - 'at the top of this script as appropriate for your directory structure' - ); -} - - -// Redirect output to a client’s web browser (PDF) -header('Content-Type: application/pdf'); -header('Content-Disposition: attachment;filename="01simple.pdf"'); -header('Cache-Control: max-age=0'); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF'); -$objWriter->save('php://output'); -exit; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-xls.php b/htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-xls.php deleted file mode 100644 index 60fc901bf8d..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-xls.php +++ /dev/null @@ -1,89 +0,0 @@ -getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Add some data -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A1', 'Hello') - ->setCellValue('B2', 'world!') - ->setCellValue('C1', 'Hello') - ->setCellValue('D2', 'world!'); - -// Miscellaneous glyphs, UTF-8 -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A4', 'Miscellaneous glyphs') - ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç'); - -// Rename worksheet -$objPHPExcel->getActiveSheet()->setTitle('Simple'); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Redirect output to a client’s web browser (Excel5) -header('Content-Type: application/vnd.ms-excel'); -header('Content-Disposition: attachment;filename="01simple.xls"'); -header('Cache-Control: max-age=0'); -// If you're serving to IE 9, then the following may be needed -header('Cache-Control: max-age=1'); - -// If you're serving to IE over SSL, then the following may be needed -header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past -header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified -header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1 -header ('Pragma: public'); // HTTP/1.0 - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save('php://output'); -exit; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-xlsx.php b/htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-xlsx.php deleted file mode 100644 index 538888ea735..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/01simple-download-xlsx.php +++ /dev/null @@ -1,89 +0,0 @@ -getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Add some data -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A1', 'Hello') - ->setCellValue('B2', 'world!') - ->setCellValue('C1', 'Hello') - ->setCellValue('D2', 'world!'); - -// Miscellaneous glyphs, UTF-8 -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A4', 'Miscellaneous glyphs') - ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç'); - -// Rename worksheet -$objPHPExcel->getActiveSheet()->setTitle('Simple'); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Redirect output to a client’s web browser (Excel2007) -header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); -header('Content-Disposition: attachment;filename="01simple.xlsx"'); -header('Cache-Control: max-age=0'); -// If you're serving to IE 9, then the following may be needed -header('Cache-Control: max-age=1'); - -// If you're serving to IE over SSL, then the following may be needed -header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past -header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified -header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1 -header ('Pragma: public'); // HTTP/1.0 - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save('php://output'); -exit; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/01simple.php b/htdocs/includes/phpoffice/phpexcel/Examples/01simple.php deleted file mode 100644 index 965fefafebc..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/01simple.php +++ /dev/null @@ -1,118 +0,0 @@ -'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("PHPExcel Test Document") - ->setSubject("PHPExcel Test Document") - ->setDescription("Test document for PHPExcel, generated using PHP classes.") - ->setKeywords("office PHPExcel php") - ->setCategory("Test result file"); - - -// Add some data -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A1', 'Hello') - ->setCellValue('B2', 'world!') - ->setCellValue('C1', 'Hello') - ->setCellValue('D2', 'world!'); - -// Miscellaneous glyphs, UTF-8 -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A4', 'Miscellaneous glyphs') - ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç'); - - -$objPHPExcel->getActiveSheet()->setCellValue('A8',"Hello\nWorld"); -$objPHPExcel->getActiveSheet()->getRowDimension(8)->setRowHeight(-1); -$objPHPExcel->getActiveSheet()->getStyle('A8')->getAlignment()->setWrapText(true); - - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Simple'); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/01simplePCLZip.php b/htdocs/includes/phpoffice/phpexcel/Examples/01simplePCLZip.php deleted file mode 100644 index 0b7a46c17d5..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/01simplePCLZip.php +++ /dev/null @@ -1,106 +0,0 @@ -'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("PHPExcel Test Document") - ->setSubject("PHPExcel Test Document") - ->setDescription("Test document for PHPExcel, generated using PHP classes.") - ->setKeywords("office PHPExcel php") - ->setCategory("Test result file"); - - -// Add some data -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A1', 'Hello') - ->setCellValue('B2', 'world!') - ->setCellValue('C1', 'Hello') - ->setCellValue('D2', 'world!'); - -// Miscellaneous glyphs, UTF-8 -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A4', 'Miscellaneous glyphs') - ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç'); - - -$objPHPExcel->getActiveSheet()->setCellValue('A8',"Hello\nWorld"); -$objPHPExcel->getActiveSheet()->getRowDimension(8)->setRowHeight(-1); -$objPHPExcel->getActiveSheet()->getStyle('A8')->getAlignment()->setWrapText(true); - - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Simple'); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -// Use PCLZip rather than ZipArchive to create the Excel2007 OfficeOpenXML file -PHPExcel_Settings::setZipClass(PHPExcel_Settings::PCLZIP); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/02types-xls.php b/htdocs/includes/phpoffice/phpexcel/Examples/02types-xls.php deleted file mode 100644 index cc1dc3744f9..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/02types-xls.php +++ /dev/null @@ -1,183 +0,0 @@ -'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - -// Set default font -echo date('H:i:s') , " Set default font" , EOL; -$objPHPExcel->getDefaultStyle()->getFont()->setName('Arial') - ->setSize(10); - -// Add some data, resembling some different data types -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->getActiveSheet()->setCellValue('A1', 'String') - ->setCellValue('B1', 'Simple') - ->setCellValue('C1', 'PHPExcel'); - -$objPHPExcel->getActiveSheet()->setCellValue('A2', 'String') - ->setCellValue('B2', 'Symbols') - ->setCellValue('C2', '!+&=()~§±æþ'); - -$objPHPExcel->getActiveSheet()->setCellValue('A3', 'String') - ->setCellValue('B3', 'UTF-8') - ->setCellValue('C3', 'Создать MS Excel Книги из PHP скриптов'); - -$objPHPExcel->getActiveSheet()->setCellValue('A4', 'Number') - ->setCellValue('B4', 'Integer') - ->setCellValue('C4', 12); - -$objPHPExcel->getActiveSheet()->setCellValue('A5', 'Number') - ->setCellValue('B5', 'Float') - ->setCellValue('C5', 34.56); - -$objPHPExcel->getActiveSheet()->setCellValue('A6', 'Number') - ->setCellValue('B6', 'Negative') - ->setCellValue('C6', -7.89); - -$objPHPExcel->getActiveSheet()->setCellValue('A7', 'Boolean') - ->setCellValue('B7', 'True') - ->setCellValue('C7', true); - -$objPHPExcel->getActiveSheet()->setCellValue('A8', 'Boolean') - ->setCellValue('B8', 'False') - ->setCellValue('C8', false); - -$dateTimeNow = time(); -$objPHPExcel->getActiveSheet()->setCellValue('A9', 'Date/Time') - ->setCellValue('B9', 'Date') - ->setCellValue('C9', PHPExcel_Shared_Date::PHPToExcel( $dateTimeNow )); -$objPHPExcel->getActiveSheet()->getStyle('C9')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2); - -$objPHPExcel->getActiveSheet()->setCellValue('A10', 'Date/Time') - ->setCellValue('B10', 'Time') - ->setCellValue('C10', PHPExcel_Shared_Date::PHPToExcel( $dateTimeNow )); -$objPHPExcel->getActiveSheet()->getStyle('C10')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4); - -$objPHPExcel->getActiveSheet()->setCellValue('A11', 'Date/Time') - ->setCellValue('B11', 'Date and Time') - ->setCellValue('C11', PHPExcel_Shared_Date::PHPToExcel( $dateTimeNow )); -$objPHPExcel->getActiveSheet()->getStyle('C11')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DATETIME); - -$objPHPExcel->getActiveSheet()->setCellValue('A12', 'NULL') - ->setCellValue('C12', NULL); - -$objRichText = new PHPExcel_RichText(); -$objRichText->createText('你好 '); -$objPayable = $objRichText->createTextRun('你 好 吗?'); -$objPayable->getFont()->setBold(true); -$objPayable->getFont()->setItalic(true); -$objPayable->getFont()->setColor( new PHPExcel_Style_Color( PHPExcel_Style_Color::COLOR_DARKGREEN ) ); - -$objRichText->createText(', unless specified otherwise on the invoice.'); - -$objPHPExcel->getActiveSheet()->setCellValue('A13', 'Rich Text') - ->setCellValue('C13', $objRichText); - - -$objRichText2 = new PHPExcel_RichText(); -$objRichText2->createText("black text\n"); - -$objRed = $objRichText2->createTextRun("red text"); -$objRed->getFont()->setColor( new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_RED ) ); - -$objPHPExcel->getActiveSheet()->getCell("C14")->setValue($objRichText2); -$objPHPExcel->getActiveSheet()->getStyle("C14")->getAlignment()->setWrapText(true); - - -$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true); -$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setAutoSize(true); - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Datatypes'); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -echo date('H:i:s') , " Reload workbook from saved file" , EOL; -$callStartTime = microtime(true); - -$objPHPExcel = PHPExcel_IOFactory::load(str_replace('.php', '.xls', __FILE__)); - -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; -echo 'Call time to reload Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -var_dump($objPHPExcel->getActiveSheet()->toArray()); - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done testing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/02types.php b/htdocs/includes/phpoffice/phpexcel/Examples/02types.php deleted file mode 100644 index ff5421e4bba..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/02types.php +++ /dev/null @@ -1,183 +0,0 @@ -'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - -// Set default font -echo date('H:i:s') , " Set default font" , EOL; -$objPHPExcel->getDefaultStyle()->getFont()->setName('Arial') - ->setSize(10); - -// Add some data, resembling some different data types -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->getActiveSheet()->setCellValue('A1', 'String') - ->setCellValue('B1', 'Simple') - ->setCellValue('C1', 'PHPExcel'); - -$objPHPExcel->getActiveSheet()->setCellValue('A2', 'String') - ->setCellValue('B2', 'Symbols') - ->setCellValue('C2', '!+&=()~§±æþ'); - -$objPHPExcel->getActiveSheet()->setCellValue('A3', 'String') - ->setCellValue('B3', 'UTF-8') - ->setCellValue('C3', 'Создать MS Excel Книги из PHP скриптов'); - -$objPHPExcel->getActiveSheet()->setCellValue('A4', 'Number') - ->setCellValue('B4', 'Integer') - ->setCellValue('C4', 12); - -$objPHPExcel->getActiveSheet()->setCellValue('A5', 'Number') - ->setCellValue('B5', 'Float') - ->setCellValue('C5', 34.56); - -$objPHPExcel->getActiveSheet()->setCellValue('A6', 'Number') - ->setCellValue('B6', 'Negative') - ->setCellValue('C6', -7.89); - -$objPHPExcel->getActiveSheet()->setCellValue('A7', 'Boolean') - ->setCellValue('B7', 'True') - ->setCellValue('C7', true); - -$objPHPExcel->getActiveSheet()->setCellValue('A8', 'Boolean') - ->setCellValue('B8', 'False') - ->setCellValue('C8', false); - -$dateTimeNow = time(); -$objPHPExcel->getActiveSheet()->setCellValue('A9', 'Date/Time') - ->setCellValue('B9', 'Date') - ->setCellValue('C9', PHPExcel_Shared_Date::PHPToExcel( $dateTimeNow )); -$objPHPExcel->getActiveSheet()->getStyle('C9')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2); - -$objPHPExcel->getActiveSheet()->setCellValue('A10', 'Date/Time') - ->setCellValue('B10', 'Time') - ->setCellValue('C10', PHPExcel_Shared_Date::PHPToExcel( $dateTimeNow )); -$objPHPExcel->getActiveSheet()->getStyle('C10')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4); - -$objPHPExcel->getActiveSheet()->setCellValue('A11', 'Date/Time') - ->setCellValue('B11', 'Date and Time') - ->setCellValue('C11', PHPExcel_Shared_Date::PHPToExcel( $dateTimeNow )); -$objPHPExcel->getActiveSheet()->getStyle('C11')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DATETIME); - -$objPHPExcel->getActiveSheet()->setCellValue('A12', 'NULL') - ->setCellValue('C12', NULL); - -$objRichText = new PHPExcel_RichText(); -$objRichText->createText('你好 '); - -$objPayable = $objRichText->createTextRun('你 好 吗?'); -$objPayable->getFont()->setBold(true); -$objPayable->getFont()->setItalic(true); -$objPayable->getFont()->setColor( new PHPExcel_Style_Color( PHPExcel_Style_Color::COLOR_DARKGREEN ) ); - -$objRichText->createText(', unless specified otherwise on the invoice.'); - -$objPHPExcel->getActiveSheet()->setCellValue('A13', 'Rich Text') - ->setCellValue('C13', $objRichText); - - -$objRichText2 = new PHPExcel_RichText(); -$objRichText2->createText("black text\n"); - -$objRed = $objRichText2->createTextRun("red text"); -$objRed->getFont()->setColor( new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_RED ) ); - -$objPHPExcel->getActiveSheet()->getCell("C14")->setValue($objRichText2); -$objPHPExcel->getActiveSheet()->getStyle("C14")->getAlignment()->setWrapText(true); - - -$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true); -$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setAutoSize(true); - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Datatypes'); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -echo date('H:i:s') , " Reload workbook from saved file" , EOL; -$callStartTime = microtime(true); - -$objPHPExcel = PHPExcel_IOFactory::load(str_replace('.php', '.xlsx', __FILE__)); - -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; -echo 'Call time to reload Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -var_dump($objPHPExcel->getActiveSheet()->toArray()); - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done testing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/03formulas.php b/htdocs/includes/phpoffice/phpexcel/Examples/03formulas.php deleted file mode 100644 index 1396717d79d..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/03formulas.php +++ /dev/null @@ -1,149 +0,0 @@ -'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Add some data, we will use some formulas here -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->getActiveSheet()->setCellValue('A5', 'Sum:'); - -$objPHPExcel->getActiveSheet()->setCellValue('B1', 'Range #1') - ->setCellValue('B2', 3) - ->setCellValue('B3', 7) - ->setCellValue('B4', 13) - ->setCellValue('B5', '=SUM(B2:B4)'); -echo date('H:i:s') , " Sum of Range #1 is " , - $objPHPExcel->getActiveSheet()->getCell('B5')->getCalculatedValue() , EOL; - -$objPHPExcel->getActiveSheet()->setCellValue('C1', 'Range #2') - ->setCellValue('C2', 5) - ->setCellValue('C3', 11) - ->setCellValue('C4', 17) - ->setCellValue('C5', '=SUM(C2:C4)'); -echo date('H:i:s') , " Sum of Range #2 is " , - $objPHPExcel->getActiveSheet()->getCell('C5')->getCalculatedValue() , EOL; - -$objPHPExcel->getActiveSheet()->setCellValue('A7', 'Total of both ranges:'); -$objPHPExcel->getActiveSheet()->setCellValue('B7', '=SUM(B5:C5)'); -echo date('H:i:s') , " Sum of both Ranges is " , - $objPHPExcel->getActiveSheet()->getCell('B7')->getCalculatedValue() , EOL; - -$objPHPExcel->getActiveSheet()->setCellValue('A8', 'Minimum of both ranges:'); -$objPHPExcel->getActiveSheet()->setCellValue('B8', '=MIN(B2:C4)'); -echo date('H:i:s') , " Minimum value in either Range is " , - $objPHPExcel->getActiveSheet()->getCell('B8')->getCalculatedValue() , EOL; - -$objPHPExcel->getActiveSheet()->setCellValue('A9', 'Maximum of both ranges:'); -$objPHPExcel->getActiveSheet()->setCellValue('B9', '=MAX(B2:C4)'); -echo date('H:i:s') , " Maximum value in either Range is " , - $objPHPExcel->getActiveSheet()->getCell('B9')->getCalculatedValue() , EOL; - -$objPHPExcel->getActiveSheet()->setCellValue('A10', 'Average of both ranges:'); -$objPHPExcel->getActiveSheet()->setCellValue('B10', '=AVERAGE(B2:C4)'); -echo date('H:i:s') , " Average value of both Ranges is " , - $objPHPExcel->getActiveSheet()->getCell('B10')->getCalculatedValue() , EOL; - - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Formulas'); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); - -// -// If we set Pre Calculated Formulas to true then PHPExcel will calculate all formulae in the -// workbook before saving. This adds time and memory overhead, and can cause some problems with formulae -// using functions or features (such as array formulae) that aren't yet supported by the calculation engine -// If the value is false (the default) for the Excel2007 Writer, then MS Excel (or the application used to -// open the file) will need to recalculate values itself to guarantee that the correct results are available. -// -//$objWriter->setPreCalculateFormulas(true); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/04printing.php b/htdocs/includes/phpoffice/phpexcel/Examples/04printing.php deleted file mode 100644 index 14358b05e74..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/04printing.php +++ /dev/null @@ -1,125 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Add some data, we will use printing features -echo date('H:i:s') , " Add some data" , EOL; -for ($i = 1; $i < 200; $i++) { - $objPHPExcel->getActiveSheet()->setCellValue('A' . $i, $i); - $objPHPExcel->getActiveSheet()->setCellValue('B' . $i, 'Test value'); -} - -// Set header and footer. When no different headers for odd/even are used, odd header is assumed. -echo date('H:i:s') , " Set header/footer" , EOL; -$objPHPExcel->getActiveSheet()->getHeaderFooter()->setOddHeader('&L&G&C&HPlease treat this document as confidential!'); -$objPHPExcel->getActiveSheet()->getHeaderFooter()->setOddFooter('&L&B' . $objPHPExcel->getProperties()->getTitle() . '&RPage &P of &N'); - -// Add a drawing to the header -echo date('H:i:s') , " Add a drawing to the header" , EOL; -$objDrawing = new PHPExcel_Worksheet_HeaderFooterDrawing(); -$objDrawing->setName('PHPExcel logo'); -$objDrawing->setPath('./images/phpexcel_logo.gif'); -$objDrawing->setHeight(36); -$objPHPExcel->getActiveSheet()->getHeaderFooter()->addImage($objDrawing, PHPExcel_Worksheet_HeaderFooter::IMAGE_HEADER_LEFT); - -// Set page orientation and size -echo date('H:i:s') , " Set page orientation and size" , EOL; -$objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE); -$objPHPExcel->getActiveSheet()->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4); - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Printing'); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/05featuredemo.inc.php b/htdocs/includes/phpoffice/phpexcel/Examples/05featuredemo.inc.php deleted file mode 100644 index b543ca46bb7..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/05featuredemo.inc.php +++ /dev/null @@ -1,394 +0,0 @@ -getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Create a first sheet, representing sales data -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('B1', 'Invoice'); -$objPHPExcel->getActiveSheet()->setCellValue('D1', PHPExcel_Shared_Date::PHPToExcel( gmmktime(0,0,0,date('m'),date('d'),date('Y')) )); -$objPHPExcel->getActiveSheet()->getStyle('D1')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15); -$objPHPExcel->getActiveSheet()->setCellValue('E1', '#12566'); - -$objPHPExcel->getActiveSheet()->setCellValue('A3', 'Product Id'); -$objPHPExcel->getActiveSheet()->setCellValue('B3', 'Description'); -$objPHPExcel->getActiveSheet()->setCellValue('C3', 'Price'); -$objPHPExcel->getActiveSheet()->setCellValue('D3', 'Amount'); -$objPHPExcel->getActiveSheet()->setCellValue('E3', 'Total'); - -$objPHPExcel->getActiveSheet()->setCellValue('A4', '1001'); -$objPHPExcel->getActiveSheet()->setCellValue('B4', 'PHP for dummies'); -$objPHPExcel->getActiveSheet()->setCellValue('C4', '20'); -$objPHPExcel->getActiveSheet()->setCellValue('D4', '1'); -$objPHPExcel->getActiveSheet()->setCellValue('E4', '=IF(D4<>"",C4*D4,"")'); - -$objPHPExcel->getActiveSheet()->setCellValue('A5', '1012'); -$objPHPExcel->getActiveSheet()->setCellValue('B5', 'OpenXML for dummies'); -$objPHPExcel->getActiveSheet()->setCellValue('C5', '22'); -$objPHPExcel->getActiveSheet()->setCellValue('D5', '2'); -$objPHPExcel->getActiveSheet()->setCellValue('E5', '=IF(D5<>"",C5*D5,"")'); - -$objPHPExcel->getActiveSheet()->setCellValue('E6', '=IF(D6<>"",C6*D6,"")'); -$objPHPExcel->getActiveSheet()->setCellValue('E7', '=IF(D7<>"",C7*D7,"")'); -$objPHPExcel->getActiveSheet()->setCellValue('E8', '=IF(D8<>"",C8*D8,"")'); -$objPHPExcel->getActiveSheet()->setCellValue('E9', '=IF(D9<>"",C9*D9,"")'); - -$objPHPExcel->getActiveSheet()->setCellValue('D11', 'Total excl.:'); -$objPHPExcel->getActiveSheet()->setCellValue('E11', '=SUM(E4:E9)'); - -$objPHPExcel->getActiveSheet()->setCellValue('D12', 'VAT:'); -$objPHPExcel->getActiveSheet()->setCellValue('E12', '=E11*0.21'); - -$objPHPExcel->getActiveSheet()->setCellValue('D13', 'Total incl.:'); -$objPHPExcel->getActiveSheet()->setCellValue('E13', '=E11+E12'); - -// Add comment -echo date('H:i:s') , " Add comments" , EOL; - -$objPHPExcel->getActiveSheet()->getComment('E11')->setAuthor('PHPExcel'); -$objCommentRichText = $objPHPExcel->getActiveSheet()->getComment('E11')->getText()->createTextRun('PHPExcel:'); -$objCommentRichText->getFont()->setBold(true); -$objPHPExcel->getActiveSheet()->getComment('E11')->getText()->createTextRun("\r\n"); -$objPHPExcel->getActiveSheet()->getComment('E11')->getText()->createTextRun('Total amount on the current invoice, excluding VAT.'); - -$objPHPExcel->getActiveSheet()->getComment('E12')->setAuthor('PHPExcel'); -$objCommentRichText = $objPHPExcel->getActiveSheet()->getComment('E12')->getText()->createTextRun('PHPExcel:'); -$objCommentRichText->getFont()->setBold(true); -$objPHPExcel->getActiveSheet()->getComment('E12')->getText()->createTextRun("\r\n"); -$objPHPExcel->getActiveSheet()->getComment('E12')->getText()->createTextRun('Total amount of VAT on the current invoice.'); - -$objPHPExcel->getActiveSheet()->getComment('E13')->setAuthor('PHPExcel'); -$objCommentRichText = $objPHPExcel->getActiveSheet()->getComment('E13')->getText()->createTextRun('PHPExcel:'); -$objCommentRichText->getFont()->setBold(true); -$objPHPExcel->getActiveSheet()->getComment('E13')->getText()->createTextRun("\r\n"); -$objPHPExcel->getActiveSheet()->getComment('E13')->getText()->createTextRun('Total amount on the current invoice, including VAT.'); -$objPHPExcel->getActiveSheet()->getComment('E13')->setWidth('100pt'); -$objPHPExcel->getActiveSheet()->getComment('E13')->setHeight('100pt'); -$objPHPExcel->getActiveSheet()->getComment('E13')->setMarginLeft('150pt'); -$objPHPExcel->getActiveSheet()->getComment('E13')->getFillColor()->setRGB('EEEEEE'); - - -// Add rich-text string -echo date('H:i:s') , " Add rich-text string" , EOL; -$objRichText = new PHPExcel_RichText(); -$objRichText->createText('This invoice is '); - -$objPayable = $objRichText->createTextRun('payable within thirty days after the end of the month'); -$objPayable->getFont()->setBold(true); -$objPayable->getFont()->setItalic(true); -$objPayable->getFont()->setColor( new PHPExcel_Style_Color( PHPExcel_Style_Color::COLOR_DARKGREEN ) ); - -$objRichText->createText(', unless specified otherwise on the invoice.'); - -$objPHPExcel->getActiveSheet()->getCell('A18')->setValue($objRichText); - -// Merge cells -echo date('H:i:s') , " Merge cells" , EOL; -$objPHPExcel->getActiveSheet()->mergeCells('A18:E22'); -$objPHPExcel->getActiveSheet()->mergeCells('A28:B28'); // Just to test... -$objPHPExcel->getActiveSheet()->unmergeCells('A28:B28'); // Just to test... - -// Protect cells -echo date('H:i:s') , " Protect cells" , EOL; -$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true); // Needs to be set to true in order to enable any worksheet protection! -$objPHPExcel->getActiveSheet()->protectCells('A3:E13', 'PHPExcel'); - -// Set cell number formats -echo date('H:i:s') , " Set cell number formats" , EOL; -$objPHPExcel->getActiveSheet()->getStyle('E4:E13')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE); - -// Set column widths -echo date('H:i:s') , " Set column widths" , EOL; -$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true); -$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(12); -$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(12); - -// Set fonts -echo date('H:i:s') , " Set fonts" , EOL; -$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setName('Candara'); -$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setSize(20); -$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setBold(true); -$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE); -$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE); - -$objPHPExcel->getActiveSheet()->getStyle('D1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE); -$objPHPExcel->getActiveSheet()->getStyle('E1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE); - -$objPHPExcel->getActiveSheet()->getStyle('D13')->getFont()->setBold(true); -$objPHPExcel->getActiveSheet()->getStyle('E13')->getFont()->setBold(true); - -// Set alignments -echo date('H:i:s') , " Set alignments" , EOL; -$objPHPExcel->getActiveSheet()->getStyle('D11')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT); -$objPHPExcel->getActiveSheet()->getStyle('D12')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT); -$objPHPExcel->getActiveSheet()->getStyle('D13')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT); - -$objPHPExcel->getActiveSheet()->getStyle('A18')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY); -$objPHPExcel->getActiveSheet()->getStyle('A18')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); - -$objPHPExcel->getActiveSheet()->getStyle('B5')->getAlignment()->setShrinkToFit(true); - -// Set thin black border outline around column -echo date('H:i:s') , " Set thin black border outline around column" , EOL; -$styleThinBlackBorderOutline = array( - 'borders' => array( - 'outline' => array( - 'style' => PHPExcel_Style_Border::BORDER_THIN, - 'color' => array('argb' => 'FF000000'), - ), - ), -); -$objPHPExcel->getActiveSheet()->getStyle('A4:E10')->applyFromArray($styleThinBlackBorderOutline); - - -// Set thick brown border outline around "Total" -echo date('H:i:s') , " Set thick brown border outline around Total" , EOL; -$styleThickBrownBorderOutline = array( - 'borders' => array( - 'outline' => array( - 'style' => PHPExcel_Style_Border::BORDER_THICK, - 'color' => array('argb' => 'FF993300'), - ), - ), -); -$objPHPExcel->getActiveSheet()->getStyle('D13:E13')->applyFromArray($styleThickBrownBorderOutline); - -// Set fills -echo date('H:i:s') , " Set fills" , EOL; -$objPHPExcel->getActiveSheet()->getStyle('A1:E1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID); -$objPHPExcel->getActiveSheet()->getStyle('A1:E1')->getFill()->getStartColor()->setARGB('FF808080'); - -// Set style for header row using alternative method -echo date('H:i:s') , " Set style for header row using alternative method" , EOL; -$objPHPExcel->getActiveSheet()->getStyle('A3:E3')->applyFromArray( - array( - 'font' => array( - 'bold' => true - ), - 'alignment' => array( - 'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_RIGHT, - ), - 'borders' => array( - 'top' => array( - 'style' => PHPExcel_Style_Border::BORDER_THIN - ) - ), - 'fill' => array( - 'type' => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR, - 'rotation' => 90, - 'startcolor' => array( - 'argb' => 'FFA0A0A0' - ), - 'endcolor' => array( - 'argb' => 'FFFFFFFF' - ) - ) - ) -); - -$objPHPExcel->getActiveSheet()->getStyle('A3')->applyFromArray( - array( - 'alignment' => array( - 'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_LEFT, - ), - 'borders' => array( - 'left' => array( - 'style' => PHPExcel_Style_Border::BORDER_THIN - ) - ) - ) -); - -$objPHPExcel->getActiveSheet()->getStyle('B3')->applyFromArray( - array( - 'alignment' => array( - 'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_LEFT, - ) - ) -); - -$objPHPExcel->getActiveSheet()->getStyle('E3')->applyFromArray( - array( - 'borders' => array( - 'right' => array( - 'style' => PHPExcel_Style_Border::BORDER_THIN - ) - ) - ) -); - -// Unprotect a cell -echo date('H:i:s') , " Unprotect a cell" , EOL; -$objPHPExcel->getActiveSheet()->getStyle('B1')->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED); - -// Add a hyperlink to the sheet -echo date('H:i:s') , " Add a hyperlink to an external website" , EOL; -$objPHPExcel->getActiveSheet()->setCellValue('E26', 'www.phpexcel.net'); -$objPHPExcel->getActiveSheet()->getCell('E26')->getHyperlink()->setUrl('http://www.phpexcel.net'); -$objPHPExcel->getActiveSheet()->getCell('E26')->getHyperlink()->setTooltip('Navigate to website'); -$objPHPExcel->getActiveSheet()->getStyle('E26')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT); - -echo date('H:i:s') , " Add a hyperlink to another cell on a different worksheet within the workbook" , EOL; -$objPHPExcel->getActiveSheet()->setCellValue('E27', 'Terms and conditions'); -$objPHPExcel->getActiveSheet()->getCell('E27')->getHyperlink()->setUrl("sheet://'Terms and conditions'!A1"); -$objPHPExcel->getActiveSheet()->getCell('E27')->getHyperlink()->setTooltip('Review terms and conditions'); -$objPHPExcel->getActiveSheet()->getStyle('E27')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT); - -// Add a drawing to the worksheet -echo date('H:i:s') , " Add a drawing to the worksheet" , EOL; -$objDrawing = new PHPExcel_Worksheet_Drawing(); -$objDrawing->setName('Logo'); -$objDrawing->setDescription('Logo'); -$objDrawing->setPath('./images/officelogo.jpg'); -$objDrawing->setHeight(36); -$objDrawing->setWorksheet($objPHPExcel->getActiveSheet()); - -// Add a drawing to the worksheet -echo date('H:i:s') , " Add a drawing to the worksheet" , EOL; -$objDrawing = new PHPExcel_Worksheet_Drawing(); -$objDrawing->setName('Paid'); -$objDrawing->setDescription('Paid'); -$objDrawing->setPath('./images/paid.png'); -$objDrawing->setCoordinates('B15'); -$objDrawing->setOffsetX(110); -$objDrawing->setRotation(25); -$objDrawing->getShadow()->setVisible(true); -$objDrawing->getShadow()->setDirection(45); -$objDrawing->setWorksheet($objPHPExcel->getActiveSheet()); - -// Add a drawing to the worksheet -echo date('H:i:s') , " Add a drawing to the worksheet" , EOL; -$objDrawing = new PHPExcel_Worksheet_Drawing(); -$objDrawing->setName('PHPExcel logo'); -$objDrawing->setDescription('PHPExcel logo'); -$objDrawing->setPath('./images/phpexcel_logo.gif'); -$objDrawing->setHeight(36); -$objDrawing->setCoordinates('D24'); -$objDrawing->setOffsetX(10); -$objDrawing->setWorksheet($objPHPExcel->getActiveSheet()); - -// Play around with inserting and removing rows and columns -echo date('H:i:s') , " Play around with inserting and removing rows and columns" , EOL; -$objPHPExcel->getActiveSheet()->insertNewRowBefore(6, 10); -$objPHPExcel->getActiveSheet()->removeRow(6, 10); -$objPHPExcel->getActiveSheet()->insertNewColumnBefore('E', 5); -$objPHPExcel->getActiveSheet()->removeColumn('E', 5); - -// Set header and footer. When no different headers for odd/even are used, odd header is assumed. -echo date('H:i:s') , " Set header/footer" , EOL; -$objPHPExcel->getActiveSheet()->getHeaderFooter()->setOddHeader('&L&BInvoice&RPrinted on &D'); -$objPHPExcel->getActiveSheet()->getHeaderFooter()->setOddFooter('&L&B' . $objPHPExcel->getProperties()->getTitle() . '&RPage &P of &N'); - -// Set page orientation and size -echo date('H:i:s') , " Set page orientation and size" , EOL; -$objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT); -$objPHPExcel->getActiveSheet()->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4); - -// Rename first worksheet -echo date('H:i:s') , " Rename first worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Invoice'); - - -// Create a new worksheet, after the default sheet -echo date('H:i:s') , " Create a second Worksheet object" , EOL; -$objPHPExcel->createSheet(); - -// Llorem ipsum... -$sLloremIpsum = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus eget ante. Sed cursus nunc semper tortor. Aliquam luctus purus non elit. Fusce vel elit commodo sapien dignissim dignissim. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur accumsan magna sed massa. Nullam bibendum quam ac ipsum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin augue. Praesent malesuada justo sed orci. Pellentesque lacus ligula, sodales quis, ultricies a, ultricies vitae, elit. Sed luctus consectetuer dolor. Vivamus vel sem ut nisi sodales accumsan. Nunc et felis. Suspendisse semper viverra odio. Morbi at odio. Integer a orci a purus venenatis molestie. Nam mattis. Praesent rhoncus, nisi vel mattis auctor, neque nisi faucibus sem, non dapibus elit pede ac nisl. Cras turpis.'; - -// Add some data to the second sheet, resembling some different data types -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(1); -$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Terms and conditions'); -$objPHPExcel->getActiveSheet()->setCellValue('A3', $sLloremIpsum); -$objPHPExcel->getActiveSheet()->setCellValue('A4', $sLloremIpsum); -$objPHPExcel->getActiveSheet()->setCellValue('A5', $sLloremIpsum); -$objPHPExcel->getActiveSheet()->setCellValue('A6', $sLloremIpsum); - -// Set the worksheet tab color -echo date('H:i:s') , " Set the worksheet tab color" , EOL; -$objPHPExcel->getActiveSheet()->getTabColor()->setARGB('FF0094FF');; - -// Set alignments -echo date('H:i:s') , " Set alignments" , EOL; -$objPHPExcel->getActiveSheet()->getStyle('A3:A6')->getAlignment()->setWrapText(true); - -// Set column widths -echo date('H:i:s') , " Set column widths" , EOL; -$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(80); - -// Set fonts -echo date('H:i:s') , " Set fonts" , EOL; -$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setName('Candara'); -$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(20); -$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true); -$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE); - -$objPHPExcel->getActiveSheet()->getStyle('A3:A6')->getFont()->setSize(8); - -// Add a drawing to the worksheet -echo date('H:i:s') , " Add a drawing to the worksheet" , EOL; -$objDrawing = new PHPExcel_Worksheet_Drawing(); -$objDrawing->setName('Terms and conditions'); -$objDrawing->setDescription('Terms and conditions'); -$objDrawing->setPath('./images/termsconditions.jpg'); -$objDrawing->setCoordinates('B14'); -$objDrawing->setWorksheet($objPHPExcel->getActiveSheet()); - -// Set page orientation and size -echo date('H:i:s') , " Set page orientation and size" , EOL; -$objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE); -$objPHPExcel->getActiveSheet()->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4); - -// Rename second worksheet -echo date('H:i:s') , " Rename second worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Terms and conditions'); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/05featuredemo.php b/htdocs/includes/phpoffice/phpexcel/Examples/05featuredemo.php deleted file mode 100644 index 66d4980ec51..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/05featuredemo.php +++ /dev/null @@ -1,78 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -include "05featuredemo.inc.php"; - -/** Include PHPExcel_IOFactory */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php'; - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/06largescale-with-cellcaching-sqlite.php b/htdocs/includes/phpoffice/phpexcel/Examples/06largescale-with-cellcaching-sqlite.php deleted file mode 100644 index cbdb59b91b1..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/06largescale-with-cellcaching-sqlite.php +++ /dev/null @@ -1,129 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - -$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_sqlite; -if (PHPExcel_Settings::setCacheStorageMethod($cacheMethod)) { - echo date('H:i:s') , " Enable Cell Caching using " , $cacheMethod , " method" , EOL; -} else { - echo date('H:i:s') , " Unable to set Cell Caching using " , $cacheMethod , " method, reverting to memory" , EOL; -} - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Create a first sheet -echo date('H:i:s') , " Add data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', "Firstname"); -$objPHPExcel->getActiveSheet()->setCellValue('B1', "Lastname"); -$objPHPExcel->getActiveSheet()->setCellValue('C1', "Phone"); -$objPHPExcel->getActiveSheet()->setCellValue('D1', "Fax"); -$objPHPExcel->getActiveSheet()->setCellValue('E1', "Is Client ?"); - - -// Hide "Phone" and "fax" column -echo date('H:i:s') , " Hide 'Phone' and 'fax' columns" , EOL; -$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setVisible(false); -$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setVisible(false); - - -// Set outline levels -echo date('H:i:s') , " Set outline levels" , EOL; -$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setOutlineLevel(1) - ->setVisible(false) - ->setCollapsed(true); - -// Freeze panes -echo date('H:i:s') , " Freeze panes" , EOL; -$objPHPExcel->getActiveSheet()->freezePane('A2'); - - -// Rows to repeat at top -echo date('H:i:s') , " Rows to repeat at top" , EOL; -$objPHPExcel->getActiveSheet()->getPageSetup()->setRowsToRepeatAtTopByStartAndEnd(1, 1); - - -// Add data -for ($i = 2; $i <= 5000; $i++) { - $objPHPExcel->getActiveSheet()->setCellValue('A' . $i, "FName $i") - ->setCellValue('B' . $i, "LName $i") - ->setCellValue('C' . $i, "PhoneNo $i") - ->setCellValue('D' . $i, "FaxNo $i") - ->setCellValue('E' . $i, true); -} - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/06largescale-with-cellcaching-sqlite3.php b/htdocs/includes/phpoffice/phpexcel/Examples/06largescale-with-cellcaching-sqlite3.php deleted file mode 100644 index ca04f85e92c..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/06largescale-with-cellcaching-sqlite3.php +++ /dev/null @@ -1,129 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - -$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_sqlite3; -if (PHPExcel_Settings::setCacheStorageMethod($cacheMethod)) { - echo date('H:i:s') , " Enable Cell Caching using " , $cacheMethod , " method" , EOL; -} else { - echo date('H:i:s') , " Unable to set Cell Caching using " , $cacheMethod , " method, reverting to memory" , EOL; -} - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Create a first sheet -echo date('H:i:s') , " Add data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', "Firstname"); -$objPHPExcel->getActiveSheet()->setCellValue('B1', "Lastname"); -$objPHPExcel->getActiveSheet()->setCellValue('C1', "Phone"); -$objPHPExcel->getActiveSheet()->setCellValue('D1', "Fax"); -$objPHPExcel->getActiveSheet()->setCellValue('E1', "Is Client ?"); - - -// Hide "Phone" and "fax" column -echo date('H:i:s') , " Hide 'Phone' and 'fax' columns" , EOL; -$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setVisible(false); -$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setVisible(false); - - -// Set outline levels -echo date('H:i:s') , " Set outline levels" , EOL; -$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setOutlineLevel(1) - ->setVisible(false) - ->setCollapsed(true); - -// Freeze panes -echo date('H:i:s') , " Freeze panes" , EOL; -$objPHPExcel->getActiveSheet()->freezePane('A2'); - - -// Rows to repeat at top -echo date('H:i:s') , " Rows to repeat at top" , EOL; -$objPHPExcel->getActiveSheet()->getPageSetup()->setRowsToRepeatAtTopByStartAndEnd(1, 1); - - -// Add data -for ($i = 2; $i <= 5000; $i++) { - $objPHPExcel->getActiveSheet()->setCellValue('A' . $i, "FName $i") - ->setCellValue('B' . $i, "LName $i") - ->setCellValue('C' . $i, "PhoneNo $i") - ->setCellValue('D' . $i, "FaxNo $i") - ->setCellValue('E' . $i, true); -} - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/06largescale-with-cellcaching.php b/htdocs/includes/phpoffice/phpexcel/Examples/06largescale-with-cellcaching.php deleted file mode 100644 index aa23b8cbb8a..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/06largescale-with-cellcaching.php +++ /dev/null @@ -1,128 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - -$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip; -if (!PHPExcel_Settings::setCacheStorageMethod($cacheMethod)) { - die($cacheMethod . " caching method is not available" . EOL); -} -echo date('H:i:s') , " Enable Cell Caching using " , $cacheMethod , " method" , EOL; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Create a first sheet -echo date('H:i:s') , " Add data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', "Firstname"); -$objPHPExcel->getActiveSheet()->setCellValue('B1', "Lastname"); -$objPHPExcel->getActiveSheet()->setCellValue('C1', "Phone"); -$objPHPExcel->getActiveSheet()->setCellValue('D1', "Fax"); -$objPHPExcel->getActiveSheet()->setCellValue('E1', "Is Client ?"); - - -// Hide "Phone" and "fax" column -echo date('H:i:s') , " Hide 'Phone' and 'fax' columns" , EOL; -$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setVisible(false); -$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setVisible(false); - - -// Set outline levels -echo date('H:i:s') , " Set outline levels" , EOL; -$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setOutlineLevel(1) - ->setVisible(false) - ->setCollapsed(true); - -// Freeze panes -echo date('H:i:s') , " Freeze panes" , EOL; -$objPHPExcel->getActiveSheet()->freezePane('A2'); - - -// Rows to repeat at top -echo date('H:i:s') , " Rows to repeat at top" , EOL; -$objPHPExcel->getActiveSheet()->getPageSetup()->setRowsToRepeatAtTopByStartAndEnd(1, 1); - - -// Add data -for ($i = 2; $i <= 5000; $i++) { - $objPHPExcel->getActiveSheet()->setCellValue('A' . $i, "FName $i") - ->setCellValue('B' . $i, "LName $i") - ->setCellValue('C' . $i, "PhoneNo $i") - ->setCellValue('D' . $i, "FaxNo $i") - ->setCellValue('E' . $i, true); -} - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/06largescale-xls.php b/htdocs/includes/phpoffice/phpexcel/Examples/06largescale-xls.php deleted file mode 100644 index 00137ad896b..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/06largescale-xls.php +++ /dev/null @@ -1,136 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -/* -After doing some test, I've got these results benchmarked -for writing to Excel2007: - - Number of rows Seconds to generate - 200 3 - 500 4 - 1000 6 - 2000 12 - 4000 36 - 8000 64 - 15000 465 -*/ - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Create a first sheet -echo date('H:i:s') , " Add data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', "Firstname"); -$objPHPExcel->getActiveSheet()->setCellValue('B1', "Lastname"); -$objPHPExcel->getActiveSheet()->setCellValue('C1', "Phone"); -$objPHPExcel->getActiveSheet()->setCellValue('D1', "Fax"); -$objPHPExcel->getActiveSheet()->setCellValue('E1', "Is Client ?"); - - -// Hide "Phone" and "fax" column -echo date('H:i:s') , " Hide 'Phone' and 'fax' columns" , EOL; -$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setVisible(false); -$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setVisible(false); - - -// Set outline levels -echo date('H:i:s') , " Set outline levels" , EOL; -$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setOutlineLevel(1) - ->setVisible(false) - ->setCollapsed(true); - -// Freeze panes -echo date('H:i:s') , " Freeze panes" , EOL; -$objPHPExcel->getActiveSheet()->freezePane('A2'); - - -// Rows to repeat at top -echo date('H:i:s') , " Rows to repeat at top" , EOL; -$objPHPExcel->getActiveSheet()->getPageSetup()->setRowsToRepeatAtTopByStartAndEnd(1, 1); - - -// Add data -for ($i = 2; $i <= 5000; $i++) { - $objPHPExcel->getActiveSheet()->setCellValue('A' . $i, "FName $i") - ->setCellValue('B' . $i, "LName $i") - ->setCellValue('C' . $i, "PhoneNo $i") - ->setCellValue('D' . $i, "FaxNo $i") - ->setCellValue('E' . $i, true); -} - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/06largescale.php b/htdocs/includes/phpoffice/phpexcel/Examples/06largescale.php deleted file mode 100644 index b0fa44047a3..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/06largescale.php +++ /dev/null @@ -1,136 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -/* -After doing some test, I've got these results benchmarked -for writing to Excel2007: - - Number of rows Seconds to generate - 200 3 - 500 4 - 1000 6 - 2000 12 - 4000 36 - 8000 64 - 15000 465 -*/ - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Create a first sheet -echo date('H:i:s') , " Add data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', "Firstname"); -$objPHPExcel->getActiveSheet()->setCellValue('B1', "Lastname"); -$objPHPExcel->getActiveSheet()->setCellValue('C1', "Phone"); -$objPHPExcel->getActiveSheet()->setCellValue('D1', "Fax"); -$objPHPExcel->getActiveSheet()->setCellValue('E1', "Is Client ?"); - - -// Hide "Phone" and "fax" column -echo date('H:i:s') , " Hide 'Phone' and 'fax' columns" , EOL; -$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setVisible(false); -$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setVisible(false); - - -// Set outline levels -echo date('H:i:s') , " Set outline levels" , EOL; -$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setOutlineLevel(1) - ->setVisible(false) - ->setCollapsed(true); - -// Freeze panes -echo date('H:i:s') , " Freeze panes" , EOL; -$objPHPExcel->getActiveSheet()->freezePane('A2'); - - -// Rows to repeat at top -echo date('H:i:s') , " Rows to repeat at top" , EOL; -$objPHPExcel->getActiveSheet()->getPageSetup()->setRowsToRepeatAtTopByStartAndEnd(1, 1); - - -// Add data -for ($i = 2; $i <= 5000; $i++) { - $objPHPExcel->getActiveSheet()->setCellValue('A' . $i, "FName $i") - ->setCellValue('B' . $i, "LName $i") - ->setCellValue('C' . $i, "PhoneNo $i") - ->setCellValue('D' . $i, "FaxNo $i") - ->setCellValue('E' . $i, true); -} - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/07reader.php b/htdocs/includes/phpoffice/phpexcel/Examples/07reader.php deleted file mode 100644 index 616b6622ff9..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/07reader.php +++ /dev/null @@ -1,76 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel_IOFactory */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php'; - - -if (!file_exists("05featuredemo.xlsx")) { - exit("Please run 05featuredemo.php first." . EOL); -} - -echo date('H:i:s') , " Load from Excel2007 file" , EOL; -$callStartTime = microtime(true); - -$objPHPExcel = PHPExcel_IOFactory::load("05featuredemo.xlsx"); - -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; -echo 'Call time to read Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); - -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/07readerPCLZip.php b/htdocs/includes/phpoffice/phpexcel/Examples/07readerPCLZip.php deleted file mode 100644 index 90e85905019..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/07readerPCLZip.php +++ /dev/null @@ -1,79 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel_IOFactory */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php'; - - -if (!file_exists("05featuredemo.xlsx")) { - exit("Please run 05featuredemo.php first." . EOL); -} - -// Use PCLZip rather than ZipArchive to read the Excel2007 OfficeOpenXML file -PHPExcel_Settings::setZipClass(PHPExcel_Settings::PCLZIP); - -echo date('H:i:s') , " Load from Excel2007 file" , EOL; -$callStartTime = microtime(true); - -$objPHPExcel = PHPExcel_IOFactory::load("05featuredemo.xlsx"); - -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; -echo 'Call time to read Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); - -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/08conditionalformatting.php b/htdocs/includes/phpoffice/phpexcel/Examples/08conditionalformatting.php deleted file mode 100644 index f65ec9efd32..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/08conditionalformatting.php +++ /dev/null @@ -1,189 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Create a first sheet, representing sales data -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Description') - ->setCellValue('B1', 'Amount'); - -$objPHPExcel->getActiveSheet()->setCellValue('A2', 'Paycheck received') - ->setCellValue('B2', 100); - -$objPHPExcel->getActiveSheet()->setCellValue('A3', 'Cup of coffee bought') - ->setCellValue('B3', -1.5); - -$objPHPExcel->getActiveSheet()->setCellValue('A4', 'Cup of coffee bought') - ->setCellValue('B4', -1.5); - -$objPHPExcel->getActiveSheet()->setCellValue('A5', 'Cup of tea bought') - ->setCellValue('B5', -1.2); - -$objPHPExcel->getActiveSheet()->setCellValue('A6', 'Found some money') - ->setCellValue('B6', 8); - -$objPHPExcel->getActiveSheet()->setCellValue('A7', 'Total:') - ->setCellValue('B7', '=SUM(B2:B6)'); - - -// Set column widths -echo date('H:i:s') , " Set column widths" , EOL; -$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(30); -$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(12); - - -// Add conditional formatting -echo date('H:i:s') , " Add conditional formatting" , EOL; -$objConditional1 = new PHPExcel_Style_Conditional(); -$objConditional1->setConditionType(PHPExcel_Style_Conditional::CONDITION_CELLIS) - ->setOperatorType(PHPExcel_Style_Conditional::OPERATOR_BETWEEN) - ->addCondition('200') - ->addCondition('400'); -$objConditional1->getStyle()->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_YELLOW); -$objConditional1->getStyle()->getFont()->setBold(true); -$objConditional1->getStyle()->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE); - -$objConditional2 = new PHPExcel_Style_Conditional(); -$objConditional2->setConditionType(PHPExcel_Style_Conditional::CONDITION_CELLIS) - ->setOperatorType(PHPExcel_Style_Conditional::OPERATOR_LESSTHAN) - ->addCondition('0'); -$objConditional2->getStyle()->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED); -$objConditional2->getStyle()->getFont()->setItalic(true); -$objConditional2->getStyle()->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE); - -$objConditional3 = new PHPExcel_Style_Conditional(); -$objConditional3->setConditionType(PHPExcel_Style_Conditional::CONDITION_CELLIS) - ->setOperatorType(PHPExcel_Style_Conditional::OPERATOR_GREATERTHANOREQUAL) - ->addCondition('0'); -$objConditional3->getStyle()->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_GREEN); -$objConditional3->getStyle()->getFont()->setItalic(true); -$objConditional3->getStyle()->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE); - -$conditionalStyles = $objPHPExcel->getActiveSheet()->getStyle('B2')->getConditionalStyles(); -array_push($conditionalStyles, $objConditional1); -array_push($conditionalStyles, $objConditional2); -array_push($conditionalStyles, $objConditional3); -$objPHPExcel->getActiveSheet()->getStyle('B2')->setConditionalStyles($conditionalStyles); - - -// duplicate the conditional styles across a range of cells -echo date('H:i:s') , " Duplicate the conditional formatting across a range of cells" , EOL; -$objPHPExcel->getActiveSheet()->duplicateConditionalStyle( - $objPHPExcel->getActiveSheet()->getStyle('B2')->getConditionalStyles(), - 'B3:B7' - ); - - -// Set fonts -echo date('H:i:s') , " Set fonts" , EOL; -$objPHPExcel->getActiveSheet()->getStyle('A1:B1')->getFont()->setBold(true); -//$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setBold(true); -$objPHPExcel->getActiveSheet()->getStyle('A7:B7')->getFont()->setBold(true); -//$objPHPExcel->getActiveSheet()->getStyle('B7')->getFont()->setBold(true); - - -// Set header and footer. When no different headers for odd/even are used, odd header is assumed. -echo date('H:i:s') , " Set header/footer" , EOL; -$objPHPExcel->getActiveSheet()->getHeaderFooter()->setOddHeader('&L&BPersonal cash register&RPrinted on &D'); -$objPHPExcel->getActiveSheet()->getHeaderFooter()->setOddFooter('&L&B' . $objPHPExcel->getProperties()->getTitle() . '&RPage &P of &N'); - - -// Set page orientation and size -echo date('H:i:s') , " Set page orientation and size" , EOL; -$objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT); -$objPHPExcel->getActiveSheet()->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4); - - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Invoice'); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Save Excel5 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/08conditionalformatting2.php b/htdocs/includes/phpoffice/phpexcel/Examples/08conditionalformatting2.php deleted file mode 100644 index bbe084a26fb..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/08conditionalformatting2.php +++ /dev/null @@ -1,136 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Create a first sheet, representing sales data -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet() - ->setCellValue('A1', '-0.5') - ->setCellValue('A2', '-0.25') - ->setCellValue('A3', '0.0') - ->setCellValue('A4', '0.25') - ->setCellValue('A5', '0.5') - ->setCellValue('A6', '0.75') - ->setCellValue('A7', '1.0') - ->setCellValue('A8', '1.25') -; - -$objPHPExcel->getActiveSheet()->getStyle('A1:A8') - ->getNumberFormat() - ->setFormatCode( - PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00 - ); - - -// Add conditional formatting -echo date('H:i:s') , " Add conditional formatting" , EOL; -$objConditional1 = new PHPExcel_Style_Conditional(); -$objConditional1->setConditionType(PHPExcel_Style_Conditional::CONDITION_CELLIS) - ->setOperatorType(PHPExcel_Style_Conditional::OPERATOR_LESSTHAN) - ->addCondition('0'); -$objConditional1->getStyle()->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED); - -$objConditional3 = new PHPExcel_Style_Conditional(); -$objConditional3->setConditionType(PHPExcel_Style_Conditional::CONDITION_CELLIS) - ->setOperatorType(PHPExcel_Style_Conditional::OPERATOR_GREATERTHANOREQUAL) - ->addCondition('1'); -$objConditional3->getStyle()->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_GREEN); - -$conditionalStyles = $objPHPExcel->getActiveSheet()->getStyle('A1')->getConditionalStyles(); -array_push($conditionalStyles, $objConditional1); -array_push($conditionalStyles, $objConditional3); -$objPHPExcel->getActiveSheet()->getStyle('A1')->setConditionalStyles($conditionalStyles); - - -// duplicate the conditional styles across a range of cells -echo date('H:i:s') , " Duplicate the conditional formatting across a range of cells" , EOL; -$objPHPExcel->getActiveSheet()->duplicateConditionalStyle( - $objPHPExcel->getActiveSheet()->getStyle('A1')->getConditionalStyles(), - 'A2:A8' - ); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Save Excel5 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/09pagebreaks.php b/htdocs/includes/phpoffice/phpexcel/Examples/09pagebreaks.php deleted file mode 100644 index 6b8c185e3aa..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/09pagebreaks.php +++ /dev/null @@ -1,134 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Create a first sheet -echo date('H:i:s') , " Add data and page breaks" , EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', "Firstname") - ->setCellValue('B1', "Lastname") - ->setCellValue('C1', "Phone") - ->setCellValue('D1', "Fax") - ->setCellValue('E1', "Is Client ?"); - - -// Add data -for ($i = 2; $i <= 50; $i++) { - $objPHPExcel->getActiveSheet()->setCellValue('A' . $i, "FName $i"); - $objPHPExcel->getActiveSheet()->setCellValue('B' . $i, "LName $i"); - $objPHPExcel->getActiveSheet()->setCellValue('C' . $i, "PhoneNo $i"); - $objPHPExcel->getActiveSheet()->setCellValue('D' . $i, "FaxNo $i"); - $objPHPExcel->getActiveSheet()->setCellValue('E' . $i, true); - - // Add page breaks every 10 rows - if ($i % 10 == 0) { - // Add a page break - $objPHPExcel->getActiveSheet()->setBreak( 'A' . $i, PHPExcel_Worksheet::BREAK_ROW ); - } -} - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setTitle('Printing Options'); - -// Set print headers -$objPHPExcel->getActiveSheet() - ->getHeaderFooter()->setOddHeader('&C&24&K0000FF&B&U&A'); -$objPHPExcel->getActiveSheet() - ->getHeaderFooter()->setEvenHeader('&C&24&K0000FF&B&U&A'); - -// Set print footers -$objPHPExcel->getActiveSheet() - ->getHeaderFooter()->setOddFooter('&R&D &T&C&F&LPage &P / &N'); -$objPHPExcel->getActiveSheet() - ->getHeaderFooter()->setEvenFooter('&L&D &T&C&F&RPage &P / &N'); - - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/10autofilter-selection-1.php b/htdocs/includes/phpoffice/phpexcel/Examples/10autofilter-selection-1.php deleted file mode 100644 index 7542a52955c..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/10autofilter-selection-1.php +++ /dev/null @@ -1,221 +0,0 @@ -'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s').' Create new PHPExcel object'.EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s').' Set document properties'.EOL; -$objPHPExcel->getProperties()->setCreator('Maarten Balliauw') - ->setLastModifiedBy('Maarten Balliauw') - ->setTitle('PHPExcel Test Document') - ->setSubject('PHPExcel Test Document') - ->setDescription('Test document for PHPExcel, generated using PHP classes.') - ->setKeywords('office PHPExcel php') - ->setCategory('Test result file'); - -// Create the worksheet -echo date('H:i:s').' Add data'.EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Financial Year') - ->setCellValue('B1', 'Financial Period') - ->setCellValue('C1', 'Country') - ->setCellValue('D1', 'Date') - ->setCellValue('E1', 'Sales Value') - ->setCellValue('F1', 'Expenditure') - ; -$startYear = $endYear = $currentYear = date('Y'); -$startYear--; -$endYear++; - -$years = range($startYear,$endYear); -$periods = range(1,12); -$countries = array( 'United States', 'UK', 'France', 'Germany', - 'Italy', 'Spain', 'Portugal', 'Japan' - ); - -$row = 2; -foreach($years as $year) { - foreach($periods as $period) { - foreach($countries as $country) { - $endDays = date('t',mktime(0,0,0,$period,1,$year)); - for($i = 1; $i <= $endDays; ++$i) { - $eDate = PHPExcel_Shared_Date::FormattedPHPToExcel( - $year, - $period, - $i - ); - $value = rand(500,1000) * (1 + rand(-0.25,+0.25)); - $salesValue = $invoiceValue = NULL; - $incomeOrExpenditure = rand(-1,1); - if ($incomeOrExpenditure == -1) { - $expenditure = rand(-500,-1000) * (1 + rand(-0.25,+0.25)); - $income = NULL; - } elseif ($incomeOrExpenditure == 1) { - $expenditure = rand(-500,-1000) * (1 + rand(-0.25,+0.25)); - $income = rand(500,1000) * (1 + rand(-0.25,+0.25));; - } else { - $expenditure = NULL; - $income = rand(500,1000) * (1 + rand(-0.25,+0.25));; - } - $dataArray = array( $year, - $period, - $country, - $eDate, - $income, - $expenditure, - ); - $objPHPExcel->getActiveSheet()->fromArray($dataArray, NULL, 'A'.$row++); - } - } - } -} -$row--; - - -// Set styling -echo date('H:i:s').' Set styling'.EOL; -$objPHPExcel->getActiveSheet()->getStyle('A1:F1')->getFont()->setBold(true); -$objPHPExcel->getActiveSheet()->getStyle('A1:F1')->getAlignment()->setWrapText(TRUE); -$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(12.5); -$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(10.5); -$objPHPExcel->getActiveSheet()->getStyle('D2:D'.$row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2); -$objPHPExcel->getActiveSheet()->getStyle('E2:F'.$row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE); -$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(14); -$objPHPExcel->getActiveSheet()->freezePane('A2'); - - - -// Set autofilter range -echo date('H:i:s').' Set autofilter range'.EOL; -// Always include the complete filter range! -// Excel does support setting only the caption -// row, but that's not a best practise... -$objPHPExcel->getActiveSheet()->setAutoFilter($objPHPExcel->getActiveSheet()->calculateWorksheetDimension()); - -// Set active filters -$autoFilter = $objPHPExcel->getActiveSheet()->getAutoFilter(); -echo date('H:i:s').' Set active filters'.EOL; -// Filter the Country column on a filter value of countries beginning with the letter U (or Japan) -// We use * as a wildcard, so specify as U* and using a wildcard requires customFilter -$autoFilter->getColumn('C') - ->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER) - ->createRule() - ->setRule( - PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL, - 'u*' - ) - ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_CUSTOMFILTER); -$autoFilter->getColumn('C') - ->createRule() - ->setRule( - PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL, - 'japan' - ) - ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_CUSTOMFILTER); -// Filter the Date column on a filter value of the first day of every period of the current year -// We us a dateGroup ruletype for this, although it is still a standard filter -foreach($periods as $period) { - $endDate = date('t',mktime(0,0,0,$period,1,$currentYear)); - - $autoFilter->getColumn('D') - ->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER) - ->createRule() - ->setRule( - PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL, - array( - 'year' => $currentYear, - 'month' => $period, - 'day' => $endDate - ) - ) - ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP); -} -// Display only sales values that are blank -// Standard filter, operator equals, and value of NULL -$autoFilter->getColumn('E') - ->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER) - ->createRule() - ->setRule( - PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL, - '' - ); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s').' Peak memory usage: '.(memory_get_peak_usage(true) / 1024 / 1024).' MB'.EOL; - -// Echo done -echo date('H:i:s').' Done writing files'.EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/10autofilter-selection-2.php b/htdocs/includes/phpoffice/phpexcel/Examples/10autofilter-selection-2.php deleted file mode 100644 index c89173f5c75..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/10autofilter-selection-2.php +++ /dev/null @@ -1,213 +0,0 @@ -'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s').' Create new PHPExcel object'.EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s').' Set document properties'.EOL; -$objPHPExcel->getProperties()->setCreator('Maarten Balliauw') - ->setLastModifiedBy('Maarten Balliauw') - ->setTitle('PHPExcel Test Document') - ->setSubject('PHPExcel Test Document') - ->setDescription('Test document for PHPExcel, generated using PHP classes.') - ->setKeywords('office PHPExcel php') - ->setCategory('Test result file'); - -// Create the worksheet -echo date('H:i:s').' Add data'.EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Financial Year') - ->setCellValue('B1', 'Financial Period') - ->setCellValue('C1', 'Country') - ->setCellValue('D1', 'Date') - ->setCellValue('E1', 'Sales Value') - ->setCellValue('F1', 'Expenditure') - ; -$startYear = $endYear = $currentYear = date('Y'); -$startYear--; -$endYear++; - -$years = range($startYear,$endYear); -$periods = range(1,12); -$countries = array( 'United States', 'UK', 'France', 'Germany', - 'Italy', 'Spain', 'Portugal', 'Japan' - ); - -$row = 2; -foreach($years as $year) { - foreach($periods as $period) { - foreach($countries as $country) { - $endDays = date('t',mktime(0,0,0,$period,1,$year)); - for($i = 1; $i <= $endDays; ++$i) { - $eDate = PHPExcel_Shared_Date::FormattedPHPToExcel( - $year, - $period, - $i - ); - $value = rand(500,1000) * (1 + rand(-0.25,+0.25)); - $salesValue = $invoiceValue = NULL; - $incomeOrExpenditure = rand(-1,1); - if ($incomeOrExpenditure == -1) { - $expenditure = rand(-500,-1000) * (1 + rand(-0.25,+0.25)); - $income = NULL; - } elseif ($incomeOrExpenditure == 1) { - $expenditure = rand(-500,-1000) * (1 + rand(-0.25,+0.25)); - $income = rand(500,1000) * (1 + rand(-0.25,+0.25));; - } else { - $expenditure = NULL; - $income = rand(500,1000) * (1 + rand(-0.25,+0.25));; - } - $dataArray = array( $year, - $period, - $country, - $eDate, - $income, - $expenditure, - ); - $objPHPExcel->getActiveSheet()->fromArray($dataArray, NULL, 'A'.$row++); - } - } - } -} -$row--; - - -// Set styling -echo date('H:i:s').' Set styling'.EOL; -$objPHPExcel->getActiveSheet()->getStyle('A1:F1')->getFont()->setBold(true); -$objPHPExcel->getActiveSheet()->getStyle('A1:F1')->getAlignment()->setWrapText(TRUE); -$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(12.5); -$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(10.5); -$objPHPExcel->getActiveSheet()->getStyle('D2:D'.$row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2); -$objPHPExcel->getActiveSheet()->getStyle('E2:F'.$row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE); -$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(14); -$objPHPExcel->getActiveSheet()->freezePane('A2'); - - - -// Set autofilter range -echo date('H:i:s').' Set autofilter range'.EOL; -// Always include the complete filter range! -// Excel does support setting only the caption -// row, but that's not a best practise... -$objPHPExcel->getActiveSheet()->setAutoFilter($objPHPExcel->getActiveSheet()->calculateWorksheetDimension()); - -// Set active filters -$autoFilter = $objPHPExcel->getActiveSheet()->getAutoFilter(); -echo date('H:i:s').' Set active filters'.EOL; -// Filter the Country column on a filter value of Germany -// As it's just a simple value filter, we can use FILTERTYPE_FILTER -$autoFilter->getColumn('C') - ->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER) - ->createRule() - ->setRule( - PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL, - 'Germany' - ); -// Filter the Date column on a filter value of the year to date -$autoFilter->getColumn('D') - ->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_DYNAMICFILTER) - ->createRule() - ->setRule( - PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL, - NULL, - PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_YEARTODATE - ) - ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER); -// Display only sales values that are between 400 and 600 -$autoFilter->getColumn('E') - ->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER) - ->createRule() - ->setRule( - PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL, - 400 - ) - ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_CUSTOMFILTER); -$autoFilter->getColumn('E') - ->setJoin(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND) - ->createRule() - ->setRule( - PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL, - 600 - ) - ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_CUSTOMFILTER); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s').' Peak memory usage: '.(memory_get_peak_usage(true) / 1024 / 1024).' MB'.EOL; - -// Echo done -echo date('H:i:s').' Done writing files'.EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/10autofilter-selection-display.php b/htdocs/includes/phpoffice/phpexcel/Examples/10autofilter-selection-display.php deleted file mode 100644 index cf2b8acfd99..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/10autofilter-selection-display.php +++ /dev/null @@ -1,198 +0,0 @@ -'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s').' Create new PHPExcel object'.EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s').' Set document properties'.EOL; -$objPHPExcel->getProperties()->setCreator('Maarten Balliauw') - ->setLastModifiedBy('Maarten Balliauw') - ->setTitle('PHPExcel Test Document') - ->setSubject('PHPExcel Test Document') - ->setDescription('Test document for PHPExcel, generated using PHP classes.') - ->setKeywords('office PHPExcel php') - ->setCategory('Test result file'); - -// Create the worksheet -echo date('H:i:s').' Add data'.EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Financial Year') - ->setCellValue('B1', 'Financial Period') - ->setCellValue('C1', 'Country') - ->setCellValue('D1', 'Date') - ->setCellValue('E1', 'Sales Value') - ->setCellValue('F1', 'Expenditure') - ; -$startYear = $endYear = $currentYear = date('Y'); -$startYear--; -$endYear++; - -$years = range($startYear,$endYear); -$periods = range(1,12); -$countries = array( 'United States', 'UK', 'France', 'Germany', - 'Italy', 'Spain', 'Portugal', 'Japan' - ); - -$row = 2; -foreach($years as $year) { - foreach($periods as $period) { - foreach($countries as $country) { - $endDays = date('t',mktime(0,0,0,$period,1,$year)); - for($i = 1; $i <= $endDays; ++$i) { - $eDate = PHPExcel_Shared_Date::FormattedPHPToExcel( - $year, - $period, - $i - ); - $value = rand(500,1000) * (1 + rand(-0.25,+0.25)); - $salesValue = $invoiceValue = NULL; - $incomeOrExpenditure = rand(-1,1); - if ($incomeOrExpenditure == -1) { - $expenditure = rand(-500,-1000) * (1 + rand(-0.25,+0.25)); - $income = NULL; - } elseif ($incomeOrExpenditure == 1) { - $expenditure = rand(-500,-1000) * (1 + rand(-0.25,+0.25)); - $income = rand(500,1000) * (1 + rand(-0.25,+0.25));; - } else { - $expenditure = NULL; - $income = rand(500,1000) * (1 + rand(-0.25,+0.25));; - } - $dataArray = array( $year, - $period, - $country, - $eDate, - $income, - $expenditure, - ); - $objPHPExcel->getActiveSheet()->fromArray($dataArray, NULL, 'A'.$row++); - } - } - } -} -$row--; - - -// Set styling -echo date('H:i:s').' Set styling'.EOL; -$objPHPExcel->getActiveSheet()->getStyle('A1:F1')->getFont()->setBold(true); -$objPHPExcel->getActiveSheet()->getStyle('A1:F1')->getAlignment()->setWrapText(TRUE); -$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(12.5); -$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(10.5); -$objPHPExcel->getActiveSheet()->getStyle('D2:D'.$row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2); -$objPHPExcel->getActiveSheet()->getStyle('E2:F'.$row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE); -$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(14); -$objPHPExcel->getActiveSheet()->freezePane('A2'); - - - -// Set autofilter range -echo date('H:i:s').' Set autofilter range'.EOL; -// Always include the complete filter range! -// Excel does support setting only the caption -// row, but that's not a best practise... -$objPHPExcel->getActiveSheet()->setAutoFilter($objPHPExcel->getActiveSheet()->calculateWorksheetDimension()); - -// Set active filters -$autoFilter = $objPHPExcel->getActiveSheet()->getAutoFilter(); -echo date('H:i:s').' Set active filters'.EOL; -// Filter the Country column on a filter value of countries beginning with the letter U (or Japan) -// We use * as a wildcard, so specify as U* and using a wildcard requires customFilter -$autoFilter->getColumn('C') - ->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER) - ->createRule() - ->setRule( - PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL, - 'u*' - ) - ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_CUSTOMFILTER); -$autoFilter->getColumn('C') - ->createRule() - ->setRule( - PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL, - 'japan' - ) - ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_CUSTOMFILTER); -// Filter the Date column on a filter value of the first day of every period of the current year -// We us a dateGroup ruletype for this, although it is still a standard filter -foreach($periods as $period) { - $endDate = date('t',mktime(0,0,0,$period,1,$currentYear)); - - $autoFilter->getColumn('D') - ->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER) - ->createRule() - ->setRule( - PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL, - array( - 'year' => $currentYear, - 'month' => $period, - 'day' => $endDate - ) - ) - ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP); -} -// Display only sales values that are blank -// Standard filter, operator equals, and value of NULL -$autoFilter->getColumn('E') - ->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER) - ->createRule() - ->setRule( - PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL, - '' - ); - -// Execute filtering -echo date('H:i:s').' Execute filtering'.EOL; -$autoFilter->showHideRows(); - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Display Results of filtering -echo date('H:i:s').' Display filtered rows'.EOL; -foreach ($objPHPExcel->getActiveSheet()->getRowIterator() as $row) { - if ($objPHPExcel->getActiveSheet()->getRowDimension($row->getRowIndex())->getVisible()) { - echo ' Row number - ' , $row->getRowIndex() , ' '; - echo $objPHPExcel->getActiveSheet()->getCell('C'.$row->getRowIndex())->getValue(), ' '; - echo $objPHPExcel->getActiveSheet()->getCell('D'.$row->getRowIndex())->getFormattedValue(), ' '; - echo EOL; - } -} diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/10autofilter.php b/htdocs/includes/phpoffice/phpexcel/Examples/10autofilter.php deleted file mode 100644 index ea3f76343b8..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/10autofilter.php +++ /dev/null @@ -1,171 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - -// Create new PHPExcel object -echo date('H:i:s').' Create new PHPExcel object'.EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s').' Set document properties'.EOL; -$objPHPExcel->getProperties()->setCreator('Maarten Balliauw') - ->setLastModifiedBy('Maarten Balliauw') - ->setTitle('PHPExcel Test Document') - ->setSubject('PHPExcel Test Document') - ->setDescription('Test document for PHPExcel, generated using PHP classes.') - ->setKeywords('office PHPExcel php') - ->setCategory('Test result file'); - -// Create the worksheet -echo date('H:i:s').' Add data'.EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Year') - ->setCellValue('B1', 'Quarter') - ->setCellValue('C1', 'Country') - ->setCellValue('D1', 'Sales'); - -$dataArray = array(array('2010', 'Q1', 'United States', 790), - array('2010', 'Q2', 'United States', 730), - array('2010', 'Q3', 'United States', 860), - array('2010', 'Q4', 'United States', 850), - array('2011', 'Q1', 'United States', 800), - array('2011', 'Q2', 'United States', 700), - array('2011', 'Q3', 'United States', 900), - array('2011', 'Q4', 'United States', 950), - array('2010', 'Q1', 'Belgium', 380), - array('2010', 'Q2', 'Belgium', 390), - array('2010', 'Q3', 'Belgium', 420), - array('2010', 'Q4', 'Belgium', 460), - array('2011', 'Q1', 'Belgium', 400), - array('2011', 'Q2', 'Belgium', 350), - array('2011', 'Q3', 'Belgium', 450), - array('2011', 'Q4', 'Belgium', 500), - array('2010', 'Q1', 'UK', 690), - array('2010', 'Q2', 'UK', 610), - array('2010', 'Q3', 'UK', 620), - array('2010', 'Q4', 'UK', 600), - array('2011', 'Q1', 'UK', 720), - array('2011', 'Q2', 'UK', 650), - array('2011', 'Q3', 'UK', 580), - array('2011', 'Q4', 'UK', 510), - array('2010', 'Q1', 'France', 510), - array('2010', 'Q2', 'France', 490), - array('2010', 'Q3', 'France', 460), - array('2010', 'Q4', 'France', 590), - array('2011', 'Q1', 'France', 620), - array('2011', 'Q2', 'France', 650), - array('2011', 'Q3', 'France', 415), - array('2011', 'Q4', 'France', 570), - array('2010', 'Q1', 'Germany', 720), - array('2010', 'Q2', 'Germany', 680), - array('2010', 'Q3', 'Germany', 640), - array('2010', 'Q4', 'Germany', 660), - array('2011', 'Q1', 'Germany', 680), - array('2011', 'Q2', 'Germany', 620), - array('2011', 'Q3', 'Germany', 710), - array('2011', 'Q4', 'Germany', 690), - array('2010', 'Q1', 'Spain', 510), - array('2010', 'Q2', 'Spain', 490), - array('2010', 'Q3', 'Spain', 470), - array('2010', 'Q4', 'Spain', 420), - array('2011', 'Q1', 'Spain', 460), - array('2011', 'Q2', 'Spain', 390), - array('2011', 'Q3', 'Spain', 430), - array('2011', 'Q4', 'Spain', 415), - array('2010', 'Q1', 'Italy', 440), - array('2010', 'Q2', 'Italy', 410), - array('2010', 'Q3', 'Italy', 420), - array('2010', 'Q4', 'Italy', 450), - array('2011', 'Q1', 'Italy', 430), - array('2011', 'Q2', 'Italy', 370), - array('2011', 'Q3', 'Italy', 350), - array('2011', 'Q4', 'Italy', 335), - ); -$objPHPExcel->getActiveSheet()->fromArray($dataArray, NULL, 'A2'); - -// Set title row bold -echo date('H:i:s').' Set title row bold'.EOL; -$objPHPExcel->getActiveSheet()->getStyle('A1:D1')->getFont()->setBold(true); - -// Set autofilter -echo date('H:i:s').' Set autofilter'.EOL; -// Always include the complete filter range! -// Excel does support setting only the caption -// row, but that's not a best practise... -$objPHPExcel->getActiveSheet()->setAutoFilter($objPHPExcel->getActiveSheet()->calculateWorksheetDimension()); - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s').' Peak memory usage: '.(memory_get_peak_usage(true) / 1024 / 1024).' MB'.EOL; - -// Echo done -echo date('H:i:s').' Done writing files'.EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/11documentsecurity-xls.php b/htdocs/includes/phpoffice/phpexcel/Examples/11documentsecurity-xls.php deleted file mode 100644 index b104c7b8ac3..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/11documentsecurity-xls.php +++ /dev/null @@ -1,109 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Add some data -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Hello'); -$objPHPExcel->getActiveSheet()->setCellValue('B2', 'world!'); -$objPHPExcel->getActiveSheet()->setCellValue('C1', 'Hello'); -$objPHPExcel->getActiveSheet()->setCellValue('D2', 'world!'); - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Simple'); - - -// Set document security -echo date('H:i:s') , " Set document security" , EOL; -$objPHPExcel->getSecurity()->setLockWindows(true); -$objPHPExcel->getSecurity()->setLockStructure(true); -$objPHPExcel->getSecurity()->setWorkbookPassword("PHPExcel"); - - -// Set sheet security -echo date('H:i:s') , " Set sheet security" , EOL; -$objPHPExcel->getActiveSheet()->getProtection()->setPassword('PHPExcel'); -$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true); // This should be enabled in order to enable any of the following! -$objPHPExcel->getActiveSheet()->getProtection()->setSort(true); -$objPHPExcel->getActiveSheet()->getProtection()->setInsertRows(true); -$objPHPExcel->getActiveSheet()->getProtection()->setFormatCells(true); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/11documentsecurity.php b/htdocs/includes/phpoffice/phpexcel/Examples/11documentsecurity.php deleted file mode 100644 index 96f5d99300d..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/11documentsecurity.php +++ /dev/null @@ -1,109 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Add some data -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Hello'); -$objPHPExcel->getActiveSheet()->setCellValue('B2', 'world!'); -$objPHPExcel->getActiveSheet()->setCellValue('C1', 'Hello'); -$objPHPExcel->getActiveSheet()->setCellValue('D2', 'world!'); - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Simple'); - - -// Set document security -echo date('H:i:s') , " Set document security" , EOL; -$objPHPExcel->getSecurity()->setLockWindows(true); -$objPHPExcel->getSecurity()->setLockStructure(true); -$objPHPExcel->getSecurity()->setWorkbookPassword("PHPExcel"); - - -// Set sheet security -echo date('H:i:s') , " Set sheet security" , EOL; -$objPHPExcel->getActiveSheet()->getProtection()->setPassword('PHPExcel'); -$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true); // This should be enabled in order to enable any of the following! -$objPHPExcel->getActiveSheet()->getProtection()->setSort(true); -$objPHPExcel->getActiveSheet()->getProtection()->setInsertRows(true); -$objPHPExcel->getActiveSheet()->getProtection()->setFormatCells(true); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/12cellProtection.php b/htdocs/includes/phpoffice/phpexcel/Examples/12cellProtection.php deleted file mode 100644 index 77bfee4ce4b..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/12cellProtection.php +++ /dev/null @@ -1,107 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Mark Baker") - ->setLastModifiedBy("Mark Baker") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Add some data -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Crouching'); -$objPHPExcel->getActiveSheet()->setCellValue('B1', 'Tiger'); -$objPHPExcel->getActiveSheet()->setCellValue('A2', 'Hidden'); -$objPHPExcel->getActiveSheet()->setCellValue('B2', 'Dragon'); - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Simple'); - - -// Set document security -echo date('H:i:s') , " Set cell protection" , EOL; - - -// Set sheet security -echo date('H:i:s') , " Set sheet security" , EOL; -$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true); -$objPHPExcel->getActiveSheet() - ->getStyle('A2:B2') - ->getProtection()->setLocked( - PHPExcel_Style_Protection::PROTECTION_UNPROTECTED - ); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/13calculation.php b/htdocs/includes/phpoffice/phpexcel/Examples/13calculation.php deleted file mode 100644 index 01e63ea7751..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/13calculation.php +++ /dev/null @@ -1,235 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); -mt_srand(1234567890); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// List functions -echo date('H:i:s') , " List implemented functions" , EOL; -$objCalc = PHPExcel_Calculation::getInstance(); -print_r($objCalc->listFunctionNames()); - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Add some data, we will use some formulas here -echo date('H:i:s') , " Add some data and formulas" , EOL; -$objPHPExcel->getActiveSheet()->setCellValue('A14', 'Count:') - ->setCellValue('A15', 'Sum:') - ->setCellValue('A16', 'Max:') - ->setCellValue('A17', 'Min:') - ->setCellValue('A18', 'Average:') - ->setCellValue('A19', 'Median:') - ->setCellValue('A20', 'Mode:'); - -$objPHPExcel->getActiveSheet()->setCellValue('A22', 'CountA:') - ->setCellValue('A23', 'MaxA:') - ->setCellValue('A24', 'MinA:'); - -$objPHPExcel->getActiveSheet()->setCellValue('A26', 'StDev:') - ->setCellValue('A27', 'StDevA:') - ->setCellValue('A28', 'StDevP:') - ->setCellValue('A29', 'StDevPA:'); - -$objPHPExcel->getActiveSheet()->setCellValue('A31', 'DevSq:') - ->setCellValue('A32', 'Var:') - ->setCellValue('A33', 'VarA:') - ->setCellValue('A34', 'VarP:') - ->setCellValue('A35', 'VarPA:'); - -$objPHPExcel->getActiveSheet()->setCellValue('A37', 'Date:'); - - -$objPHPExcel->getActiveSheet()->setCellValue('B1', 'Range 1') - ->setCellValue('B2', 2) - ->setCellValue('B3', 8) - ->setCellValue('B4', 10) - ->setCellValue('B5', True) - ->setCellValue('B6', False) - ->setCellValue('B7', 'Text String') - ->setCellValue('B9', '22') - ->setCellValue('B10', 4) - ->setCellValue('B11', 6) - ->setCellValue('B12', 12); - -$objPHPExcel->getActiveSheet()->setCellValue('B14', '=COUNT(B2:B12)') - ->setCellValue('B15', '=SUM(B2:B12)') - ->setCellValue('B16', '=MAX(B2:B12)') - ->setCellValue('B17', '=MIN(B2:B12)') - ->setCellValue('B18', '=AVERAGE(B2:B12)') - ->setCellValue('B19', '=MEDIAN(B2:B12)') - ->setCellValue('B20', '=MODE(B2:B12)'); - -$objPHPExcel->getActiveSheet()->setCellValue('B22', '=COUNTA(B2:B12)') - ->setCellValue('B23', '=MAXA(B2:B12)') - ->setCellValue('B24', '=MINA(B2:B12)'); - -$objPHPExcel->getActiveSheet()->setCellValue('B26', '=STDEV(B2:B12)') - ->setCellValue('B27', '=STDEVA(B2:B12)') - ->setCellValue('B28', '=STDEVP(B2:B12)') - ->setCellValue('B29', '=STDEVPA(B2:B12)'); - -$objPHPExcel->getActiveSheet()->setCellValue('B31', '=DEVSQ(B2:B12)') - ->setCellValue('B32', '=VAR(B2:B12)') - ->setCellValue('B33', '=VARA(B2:B12)') - ->setCellValue('B34', '=VARP(B2:B12)') - ->setCellValue('B35', '=VARPA(B2:B12)'); - -$objPHPExcel->getActiveSheet()->setCellValue('B37', '=DATE(2007, 12, 21)') - ->setCellValue('B38', '=DATEDIF( DATE(2007, 12, 21), DATE(2007, 12, 22), "D" )') - ->setCellValue('B39', '=DATEVALUE("01-Feb-2006 10:06 AM")') - ->setCellValue('B40', '=DAY( DATE(2006, 1, 2) )') - ->setCellValue('B41', '=DAYS360( DATE(2002, 2, 3), DATE(2005, 5, 31) )'); - - -$objPHPExcel->getActiveSheet()->setCellValue('C1', 'Range 2') - ->setCellValue('C2', 1) - ->setCellValue('C3', 2) - ->setCellValue('C4', 2) - ->setCellValue('C5', 3) - ->setCellValue('C6', 3) - ->setCellValue('C7', 3) - ->setCellValue('C8', '0') - ->setCellValue('C9', 4) - ->setCellValue('C10', 4) - ->setCellValue('C11', 4) - ->setCellValue('C12', 4); - -$objPHPExcel->getActiveSheet()->setCellValue('C14', '=COUNT(C2:C12)') - ->setCellValue('C15', '=SUM(C2:C12)') - ->setCellValue('C16', '=MAX(C2:C12)') - ->setCellValue('C17', '=MIN(C2:C12)') - ->setCellValue('C18', '=AVERAGE(C2:C12)') - ->setCellValue('C19', '=MEDIAN(C2:C12)') - ->setCellValue('C20', '=MODE(C2:C12)'); - -$objPHPExcel->getActiveSheet()->setCellValue('C22', '=COUNTA(C2:C12)') - ->setCellValue('C23', '=MAXA(C2:C12)') - ->setCellValue('C24', '=MINA(C2:C12)'); - -$objPHPExcel->getActiveSheet()->setCellValue('C26', '=STDEV(C2:C12)') - ->setCellValue('C27', '=STDEVA(C2:C12)') - ->setCellValue('C28', '=STDEVP(C2:C12)') - ->setCellValue('C29', '=STDEVPA(C2:C12)'); - -$objPHPExcel->getActiveSheet()->setCellValue('C31', '=DEVSQ(C2:C12)') - ->setCellValue('C32', '=VAR(C2:C12)') - ->setCellValue('C33', '=VARA(C2:C12)') - ->setCellValue('C34', '=VARP(C2:C12)') - ->setCellValue('C35', '=VARPA(C2:C12)'); - - -$objPHPExcel->getActiveSheet()->setCellValue('D1', 'Range 3') - ->setCellValue('D2', 2) - ->setCellValue('D3', 3) - ->setCellValue('D4', 4); - -$objPHPExcel->getActiveSheet()->setCellValue('D14', '=((D2 * D3) + D4) & " should be 10"'); - -$objPHPExcel->getActiveSheet()->setCellValue('E12', 'Other functions') - ->setCellValue('E14', '=PI()') - ->setCellValue('E15', '=RAND()') - ->setCellValue('E16', '=RANDBETWEEN(5, 10)'); - -$objPHPExcel->getActiveSheet()->setCellValue('E17', 'Count of both ranges:') - ->setCellValue('F17', '=COUNT(B2:C12)'); - -$objPHPExcel->getActiveSheet()->setCellValue('E18', 'Total of both ranges:') - ->setCellValue('F18', '=SUM(B2:C12)'); - -$objPHPExcel->getActiveSheet()->setCellValue('E19', 'Maximum of both ranges:') - ->setCellValue('F19', '=MAX(B2:C12)'); - -$objPHPExcel->getActiveSheet()->setCellValue('E20', 'Minimum of both ranges:') - ->setCellValue('F20', '=MIN(B2:C12)'); - -$objPHPExcel->getActiveSheet()->setCellValue('E21', 'Average of both ranges:') - ->setCellValue('F21', '=AVERAGE(B2:C12)'); - -$objPHPExcel->getActiveSheet()->setCellValue('E22', 'Median of both ranges:') - ->setCellValue('F22', '=MEDIAN(B2:C12)'); - -$objPHPExcel->getActiveSheet()->setCellValue('E23', 'Mode of both ranges:') - ->setCellValue('F23', '=MODE(B2:C12)'); - - -// Calculated data -echo date('H:i:s') , " Calculated data" , EOL; -for ($col = 'B'; $col != 'G'; ++$col) { - for($row = 14; $row <= 41; ++$row) { - if ((!is_null($formula = $objPHPExcel->getActiveSheet()->getCell($col.$row)->getValue())) && - ($formula[0] == '=')) { - echo 'Value of ' , $col , $row , ' [' , $formula , ']: ' , - $objPHPExcel->getActiveSheet()->getCell($col.$row)->getCalculatedValue() . EOL; - } - } -} - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); - -// -// If we set Pre Calculated Formulas to true then PHPExcel will calculate all formulae in the -// workbook before saving. This adds time and memory overhead, and can cause some problems with formulae -// using functions or features (such as array formulae) that aren't yet supported by the calculation engine -// If the value is false (the default) for the Excel2007 Writer, then MS Excel (or the application used to -// open the file) will need to recalculate values itself to guarantee that the correct results are available. -// -//$objWriter->setPreCalculateFormulas(true); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/14excel5.php b/htdocs/includes/phpoffice/phpexcel/Examples/14excel5.php deleted file mode 100644 index 3fd3d69f328..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/14excel5.php +++ /dev/null @@ -1,63 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -include "05featuredemo.inc.php"; - -/** PHPExcel_IOFactory */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php'; - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/15datavalidation-xls.php b/htdocs/includes/phpoffice/phpexcel/Examples/15datavalidation-xls.php deleted file mode 100644 index 2f8fa5ee9d8..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/15datavalidation-xls.php +++ /dev/null @@ -1,142 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Create a first sheet -echo date('H:i:s') , " Add data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', "Cell B3 and B5 contain data validation...") - ->setCellValue('A3', "Number:") - ->setCellValue('B3', "10") - ->setCellValue('A5', "List:") - ->setCellValue('B5', "Item A") - ->setCellValue('A7', "List #2:") - ->setCellValue('B7', "Item #2") - ->setCellValue('D2', "Item #1") - ->setCellValue('D3', "Item #2") - ->setCellValue('D4', "Item #3") - ->setCellValue('D5', "Item #4") - ->setCellValue('D6', "Item #5") - ; - - -// Set data validation -echo date('H:i:s') , " Set data validation" , EOL; -$objValidation = $objPHPExcel->getActiveSheet()->getCell('B3')->getDataValidation(); -$objValidation->setType( PHPExcel_Cell_DataValidation::TYPE_WHOLE ); -$objValidation->setErrorStyle( PHPExcel_Cell_DataValidation::STYLE_STOP ); -$objValidation->setAllowBlank(true); -$objValidation->setShowInputMessage(true); -$objValidation->setShowErrorMessage(true); -$objValidation->setErrorTitle('Input error'); -$objValidation->setError('Only numbers between 10 and 20 are allowed!'); -$objValidation->setPromptTitle('Allowed input'); -$objValidation->setPrompt('Only numbers between 10 and 20 are allowed.'); -$objValidation->setFormula1(10); -$objValidation->setFormula2(20); - -$objValidation = $objPHPExcel->getActiveSheet()->getCell('B5')->getDataValidation(); -$objValidation->setType( PHPExcel_Cell_DataValidation::TYPE_LIST ); -$objValidation->setErrorStyle( PHPExcel_Cell_DataValidation::STYLE_INFORMATION ); -$objValidation->setAllowBlank(false); -$objValidation->setShowInputMessage(true); -$objValidation->setShowErrorMessage(true); -$objValidation->setShowDropDown(true); -$objValidation->setErrorTitle('Input error'); -$objValidation->setError('Value is not in list.'); -$objValidation->setPromptTitle('Pick from list'); -$objValidation->setPrompt('Please pick a value from the drop-down list.'); -$objValidation->setFormula1('"Item A,Item B,Item C"'); // Make sure to put the list items between " and " !!! - -$objValidation = $objPHPExcel->getActiveSheet()->getCell('B7')->getDataValidation(); -$objValidation->setType( PHPExcel_Cell_DataValidation::TYPE_LIST ); -$objValidation->setErrorStyle( PHPExcel_Cell_DataValidation::STYLE_INFORMATION ); -$objValidation->setAllowBlank(false); -$objValidation->setShowInputMessage(true); -$objValidation->setShowErrorMessage(true); -$objValidation->setShowDropDown(true); -$objValidation->setErrorTitle('Input error'); -$objValidation->setError('Value is not in list.'); -$objValidation->setPromptTitle('Pick from list'); -$objValidation->setPrompt('Please pick a value from the drop-down list.'); -$objValidation->setFormula1('$D$2:$D$6'); // Make sure NOT to put a range of cells or a formula between " and " !!! - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/15datavalidation.php b/htdocs/includes/phpoffice/phpexcel/Examples/15datavalidation.php deleted file mode 100644 index 932bacc6fa0..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/15datavalidation.php +++ /dev/null @@ -1,143 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Create a first sheet -echo date('H:i:s') , " Add data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', "Cell B3 and B5 contain data validation...") - ->setCellValue('A3', "Number:") - ->setCellValue('B3', "10") - ->setCellValue('A5', "List:") - ->setCellValue('B5', "Item A") - ->setCellValue('A7', "List #2:") - ->setCellValue('B7', "Item #2") - ->setCellValue('D2', "Item #1") - ->setCellValue('D3', "Item #2") - ->setCellValue('D4', "Item #3") - ->setCellValue('D5', "Item #4") - ->setCellValue('D6', "Item #5") - ; - - -// Set data validation -echo date('H:i:s') , " Set data validation" , EOL; -$objValidation = $objPHPExcel->getActiveSheet()->getCell('B3')->getDataValidation(); -$objValidation->setType( PHPExcel_Cell_DataValidation::TYPE_WHOLE ); -$objValidation->setErrorStyle( PHPExcel_Cell_DataValidation::STYLE_STOP ); -$objValidation->setAllowBlank(true); -$objValidation->setShowInputMessage(true); -$objValidation->setShowErrorMessage(true); -$objValidation->setErrorTitle('Input error'); -$objValidation->setError('Only numbers between 10 and 20 are allowed!'); -$objValidation->setPromptTitle('Allowed input'); -$objValidation->setPrompt('Only numbers between 10 and 20 are allowed.'); -$objValidation->setFormula1(10); -$objValidation->setFormula2(20); - -$objValidation = $objPHPExcel->getActiveSheet()->getCell('B5')->getDataValidation(); -$objValidation->setType( PHPExcel_Cell_DataValidation::TYPE_LIST ); -$objValidation->setErrorStyle( PHPExcel_Cell_DataValidation::STYLE_INFORMATION ); -$objValidation->setAllowBlank(false); -$objValidation->setShowInputMessage(true); -$objValidation->setShowErrorMessage(true); -$objValidation->setShowDropDown(true); -$objValidation->setErrorTitle('Input error'); -$objValidation->setError('Value is not in list.'); -$objValidation->setPromptTitle('Pick from list'); -$objValidation->setPrompt('Please pick a value from the drop-down list.'); -$objValidation->setFormula1('"Item A,Item B,Item C"'); // Make sure to put the list items between " and " if your list is simply a comma-separated list of values !!! - - -$objValidation = $objPHPExcel->getActiveSheet()->getCell('B7')->getDataValidation(); -$objValidation->setType( PHPExcel_Cell_DataValidation::TYPE_LIST ); -$objValidation->setErrorStyle( PHPExcel_Cell_DataValidation::STYLE_INFORMATION ); -$objValidation->setAllowBlank(false); -$objValidation->setShowInputMessage(true); -$objValidation->setShowErrorMessage(true); -$objValidation->setShowDropDown(true); -$objValidation->setErrorTitle('Input error'); -$objValidation->setError('Value is not in list.'); -$objValidation->setPromptTitle('Pick from list'); -$objValidation->setPrompt('Please pick a value from the drop-down list.'); -$objValidation->setFormula1('$D$2:$D$6'); // Make sure NOT to put a range of cells or a formula between " and " !!! - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/16csv.php b/htdocs/includes/phpoffice/phpexcel/Examples/16csv.php deleted file mode 100644 index 71ebfd00dcc..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/16csv.php +++ /dev/null @@ -1,107 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -include "05featuredemo.inc.php"; - -/** PHPExcel_IOFactory */ -require_once '../Classes/PHPExcel/IOFactory.php'; - - -echo date('H:i:s') , " Write to CSV format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV')->setDelimiter(',') - ->setEnclosure('"') - ->setLineEnding("\r\n") - ->setSheetIndex(0) - ->save(str_replace('.php', '.csv', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; -echo date('H:i:s') , " File written to " , str_replace('.php', '.csv', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -echo date('H:i:s') , " Read from CSV format" , EOL; -$callStartTime = microtime(true); -$objReader = PHPExcel_IOFactory::createReader('CSV')->setDelimiter(',') - ->setEnclosure('"') - ->setLineEnding("\r\n") - ->setSheetIndex(0); -$objPHPExcelFromCSV = $objReader->load(str_replace('.php', '.csv', __FILE__)); - -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; -echo 'Call time to reload Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter2007 = PHPExcel_IOFactory::createWriter($objPHPExcelFromCSV, 'Excel2007'); -$objWriter2007->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -echo date('H:i:s') , " Write to CSV format" , EOL; -$callStartTime = microtime(true); - -$objWriterCSV = PHPExcel_IOFactory::createWriter($objPHPExcelFromCSV, 'CSV'); -$objWriterCSV->setExcelCompatibility(true); -$objWriterCSV->save(str_replace('.php', '_excel.csv', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; -echo date('H:i:s') , " File written to " , str_replace('.php', '_excel.csv', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/17html.php b/htdocs/includes/phpoffice/phpexcel/Examples/17html.php deleted file mode 100644 index 0dc825b04a1..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/17html.php +++ /dev/null @@ -1,64 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -include "05featuredemo.inc.php"; - -/** PHPExcel_IOFactory */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php'; - - -echo date('H:i:s') , " Write to HTML format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'HTML'); -$objWriter->setSheetIndex(0); -//$objWriter->setImagesRoot('http://www.example.com'); -$objWriter->save(str_replace('.php', '.htm', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; -echo date('H:i:s') , " File written to " , str_replace('.php', '.htm', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/18extendedcalculation.php b/htdocs/includes/phpoffice/phpexcel/Examples/18extendedcalculation.php deleted file mode 100644 index 3c6fcb49227..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/18extendedcalculation.php +++ /dev/null @@ -1,108 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// List functions -echo date('H:i:s') . " List implemented functions\n"; -$objCalc = PHPExcel_Calculation::getInstance(); -print_r($objCalc->listFunctionNames()); - -// Create new PHPExcel object -echo date('H:i:s') . " Create new PHPExcel object\n"; -$objPHPExcel = new PHPExcel(); - -// Add some data, we will use some formulas here -echo date('H:i:s') . " Add some data\n"; -$objPHPExcel->getActiveSheet()->setCellValue('A14', 'Count:'); - -$objPHPExcel->getActiveSheet()->setCellValue('B1', 'Range 1'); -$objPHPExcel->getActiveSheet()->setCellValue('B2', 2); -$objPHPExcel->getActiveSheet()->setCellValue('B3', 8); -$objPHPExcel->getActiveSheet()->setCellValue('B4', 10); -$objPHPExcel->getActiveSheet()->setCellValue('B5', True); -$objPHPExcel->getActiveSheet()->setCellValue('B6', False); -$objPHPExcel->getActiveSheet()->setCellValue('B7', 'Text String'); -$objPHPExcel->getActiveSheet()->setCellValue('B9', '22'); -$objPHPExcel->getActiveSheet()->setCellValue('B10', 4); -$objPHPExcel->getActiveSheet()->setCellValue('B11', 6); -$objPHPExcel->getActiveSheet()->setCellValue('B12', 12); - -$objPHPExcel->getActiveSheet()->setCellValue('B14', '=COUNT(B2:B12)'); - -$objPHPExcel->getActiveSheet()->setCellValue('C1', 'Range 2'); -$objPHPExcel->getActiveSheet()->setCellValue('C2', 1); -$objPHPExcel->getActiveSheet()->setCellValue('C3', 2); -$objPHPExcel->getActiveSheet()->setCellValue('C4', 2); -$objPHPExcel->getActiveSheet()->setCellValue('C5', 3); -$objPHPExcel->getActiveSheet()->setCellValue('C6', 3); -$objPHPExcel->getActiveSheet()->setCellValue('C7', 3); -$objPHPExcel->getActiveSheet()->setCellValue('C8', '0'); -$objPHPExcel->getActiveSheet()->setCellValue('C9', 4); -$objPHPExcel->getActiveSheet()->setCellValue('C10', 4); -$objPHPExcel->getActiveSheet()->setCellValue('C11', 4); -$objPHPExcel->getActiveSheet()->setCellValue('C12', 4); - -$objPHPExcel->getActiveSheet()->setCellValue('C14', '=COUNT(C2:C12)'); - -$objPHPExcel->getActiveSheet()->setCellValue('D1', 'Range 3'); -$objPHPExcel->getActiveSheet()->setCellValue('D2', 2); -$objPHPExcel->getActiveSheet()->setCellValue('D3', 3); -$objPHPExcel->getActiveSheet()->setCellValue('D4', 4); - -$objPHPExcel->getActiveSheet()->setCellValue('D5', '=((D2 * D3) + D4) & " should be 10"'); - -$objPHPExcel->getActiveSheet()->setCellValue('E1', 'Other functions'); -$objPHPExcel->getActiveSheet()->setCellValue('E2', '=PI()'); -$objPHPExcel->getActiveSheet()->setCellValue('E3', '=RAND()'); -$objPHPExcel->getActiveSheet()->setCellValue('E4', '=RANDBETWEEN(5, 10)'); - -$objPHPExcel->getActiveSheet()->setCellValue('E14', 'Count of both ranges:'); -$objPHPExcel->getActiveSheet()->setCellValue('F14', '=COUNT(B2:C12)'); - -// Calculated data -echo date('H:i:s') . " Calculated data\n"; -echo 'Value of B14 [=COUNT(B2:B12)]: ' . $objPHPExcel->getActiveSheet()->getCell('B14')->getCalculatedValue() . "\r\n"; - - -// Echo memory peak usage -echo date('H:i:s') . " Peak memory usage: " . (memory_get_peak_usage(true) / 1024 / 1024) . " MB\r\n"; - -// Echo done -echo date('H:i:s') . " Done" , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/19namedrange.php b/htdocs/includes/phpoffice/phpexcel/Examples/19namedrange.php deleted file mode 100644 index acea22b6d72..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/19namedrange.php +++ /dev/null @@ -1,129 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Add some data -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); -$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Firstname:') - ->setCellValue('A2', 'Lastname:') - ->setCellValue('A3', 'Fullname:') - ->setCellValue('B1', 'Maarten') - ->setCellValue('B2', 'Balliauw') - ->setCellValue('B3', '=B1 & " " & B2'); - -// Define named ranges -echo date('H:i:s') , " Define named ranges" , EOL; -$objPHPExcel->addNamedRange( new PHPExcel_NamedRange('PersonName', $objPHPExcel->getActiveSheet(), 'B1') ); -$objPHPExcel->addNamedRange( new PHPExcel_NamedRange('PersonLN', $objPHPExcel->getActiveSheet(), 'B2') ); - -// Rename named ranges -echo date('H:i:s') , " Rename named ranges" , EOL; -$objPHPExcel->getNamedRange('PersonName')->setName('PersonFN'); - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Person'); - - -// Create a new worksheet, after the default sheet -echo date('H:i:s') , " Create new Worksheet object" , EOL; -$objPHPExcel->createSheet(); - -// Add some data to the second sheet, resembling some different data types -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(1); -$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Firstname:') - ->setCellValue('A2', 'Lastname:') - ->setCellValue('A3', 'Fullname:') - ->setCellValue('B1', '=PersonFN') - ->setCellValue('B2', '=PersonLN') - ->setCellValue('B3', '=PersonFN & " " & PersonLN'); - -// Resolve range -echo date('H:i:s') , " Resolve range" , EOL; -echo 'Cell B1 {=PersonFN}: ' , $objPHPExcel->getActiveSheet()->getCell('B1')->getCalculatedValue() , EOL; -echo 'Cell B3 {=PersonFN & " " & PersonLN}: ' , $objPHPExcel->getActiveSheet()->getCell('B3')->getCalculatedValue() , EOL; -echo 'Cell Person!B1: ' , $objPHPExcel->getActiveSheet()->getCell('Person!B1')->getCalculatedValue() , EOL; - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Person (cloned)'); - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/20readexcel5.php b/htdocs/includes/phpoffice/phpexcel/Examples/20readexcel5.php deleted file mode 100644 index 98eff9ec1b1..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/20readexcel5.php +++ /dev/null @@ -1,79 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel_IOFactory */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php'; - - -if (!file_exists("14excel5.xls")) { - exit("Please run 14excel5.php first.\n"); -} - -echo date('H:i:s') , " Load workbook from Excel5 file" , EOL; -$callStartTime = microtime(true); - -$objPHPExcel = PHPExcel_IOFactory::load("14excel5.xls"); - -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo 'Call time to load Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done reading file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/21pdf.php b/htdocs/includes/phpoffice/phpexcel/Examples/21pdf.php deleted file mode 100644 index 11c56b2caf0..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/21pdf.php +++ /dev/null @@ -1,94 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -include "05featuredemo.inc.php"; - -/** PHPExcel_IOFactory */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php'; - - -// Change these values to select the Rendering library that you wish to use -// and its directory location on your server -//$rendererName = PHPExcel_Settings::PDF_RENDERER_TCPDF; -//$rendererName = PHPExcel_Settings::PDF_RENDERER_MPDF; -$rendererName = PHPExcel_Settings::PDF_RENDERER_DOMPDF; -//$rendererLibrary = 'tcPDF5.9'; -//$rendererLibrary = 'mPDF5.4'; -$rendererLibrary = 'domPDF0.6.0beta3'; -$rendererLibraryPath = '/php/libraries/PDF/' . $rendererLibrary; - - -echo date('H:i:s') , " Hide grid lines" , EOL; -$objPHPExcel->getActiveSheet()->setShowGridLines(false); - -echo date('H:i:s') , " Set orientation to landscape" , EOL; -$objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE); - - -echo date('H:i:s') , " Write to PDF format using {$rendererName}" , EOL; - -if (!PHPExcel_Settings::setPdfRenderer( - $rendererName, - $rendererLibraryPath - )) { - die( - 'NOTICE: Please set the $rendererName and $rendererLibraryPath values' . - EOL . - 'at the top of this script as appropriate for your directory structure' - ); -} - - -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF'); -$objWriter->setSheetIndex(0); -$objWriter->save(str_replace('.php', '_'.$rendererName.'.pdf', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; -echo date('H:i:s') , " File written to " , str_replace('.php', '_'.$rendererName.'.pdf', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/22heavilyformatted.php b/htdocs/includes/phpoffice/phpexcel/Examples/22heavilyformatted.php deleted file mode 100644 index c17bc8683ae..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/22heavilyformatted.php +++ /dev/null @@ -1,116 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Add some data -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); - -$objPHPExcel->getActiveSheet()->getStyle('A1:T100')->applyFromArray( - array('fill' => array( - 'type' => PHPExcel_Style_Fill::FILL_SOLID, - 'color' => array('argb' => 'FFCCFFCC') - ), - 'borders' => array( - 'bottom' => array('style' => PHPExcel_Style_Border::BORDER_THIN), - 'right' => array('style' => PHPExcel_Style_Border::BORDER_MEDIUM) - ) - ) - ); - -$objPHPExcel->getActiveSheet()->getStyle('C5:R95')->applyFromArray( - array('fill' => array( - 'type' => PHPExcel_Style_Fill::FILL_SOLID, - 'color' => array('argb' => 'FFFFFF00') - ), - ) - ); - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/23sharedstyles.php b/htdocs/includes/phpoffice/phpexcel/Examples/23sharedstyles.php deleted file mode 100644 index 652b4ed2f27..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/23sharedstyles.php +++ /dev/null @@ -1,124 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - - -// Add some data -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(0); - -$sharedStyle1 = new PHPExcel_Style(); -$sharedStyle2 = new PHPExcel_Style(); - -$sharedStyle1->applyFromArray( - array('fill' => array( - 'type' => PHPExcel_Style_Fill::FILL_SOLID, - 'color' => array('argb' => 'FFCCFFCC') - ), - 'borders' => array( - 'bottom' => array('style' => PHPExcel_Style_Border::BORDER_THIN), - 'right' => array('style' => PHPExcel_Style_Border::BORDER_MEDIUM) - ) - )); - -$sharedStyle2->applyFromArray( - array('fill' => array( - 'type' => PHPExcel_Style_Fill::FILL_SOLID, - 'color' => array('argb' => 'FFFFFF00') - ), - 'borders' => array( - 'bottom' => array('style' => PHPExcel_Style_Border::BORDER_THIN), - 'right' => array('style' => PHPExcel_Style_Border::BORDER_MEDIUM) - ) - )); - -$objPHPExcel->getActiveSheet()->setSharedStyle($sharedStyle1, "A1:T100"); -$objPHPExcel->getActiveSheet()->setSharedStyle($sharedStyle2, "C5:R95"); - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/24readfilter.php b/htdocs/includes/phpoffice/phpexcel/Examples/24readfilter.php deleted file mode 100644 index afa6d0c416c..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/24readfilter.php +++ /dev/null @@ -1,77 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** PHPExcel_IOFactory */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php'; - - -// Check prerequisites -if (!file_exists("06largescale.xlsx")) { - exit("Please run 06largescale.php first.\n"); -} - -class MyReadFilter implements PHPExcel_Reader_IReadFilter -{ - public function readCell($column, $row, $worksheetName = '') { - // Read title row and rows 20 - 30 - if ($row == 1 || ($row >= 20 && $row <= 30)) { - return true; - } - - return false; - } -} - - -echo date('H:i:s') , " Load from Excel2007 file" , EOL; -$objReader = PHPExcel_IOFactory::createReader('Excel2007'); -$objReader->setReadFilter( new MyReadFilter() ); -$objPHPExcel = $objReader->load("06largescale.xlsx"); - -echo date('H:i:s') , " Remove unnecessary rows" , EOL; -$objPHPExcel->getActiveSheet()->removeRow(2, 18); - -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/25inmemoryimage.php b/htdocs/includes/phpoffice/phpexcel/Examples/25inmemoryimage.php deleted file mode 100644 index 7a3424e2088..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/25inmemoryimage.php +++ /dev/null @@ -1,83 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - -// Generate an image -echo date('H:i:s') , " Generate an image" , EOL; -$gdImage = @imagecreatetruecolor(120, 20) or die('Cannot Initialize new GD image stream'); -$textColor = imagecolorallocate($gdImage, 255, 255, 255); -imagestring($gdImage, 1, 5, 5, 'Created with PHPExcel', $textColor); - -// Add a drawing to the worksheet -echo date('H:i:s') , " Add a drawing to the worksheet" , EOL; -$objDrawing = new PHPExcel_Worksheet_MemoryDrawing(); -$objDrawing->setName('Sample image'); -$objDrawing->setDescription('Sample image'); -$objDrawing->setImageResource($gdImage); -$objDrawing->setRenderingFunction(PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG); -$objDrawing->setMimeType(PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_DEFAULT); -$objDrawing->setHeight(36); -$objDrawing->setWorksheet($objPHPExcel->getActiveSheet()); - -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/26utf8.php b/htdocs/includes/phpoffice/phpexcel/Examples/26utf8.php deleted file mode 100644 index ad0b400594e..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/26utf8.php +++ /dev/null @@ -1,122 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Change these values to select the PDF Rendering library that you wish to use -// and its directory location on your server -//$rendererName = PHPExcel_Settings::PDF_RENDERER_TCPDF; -//$rendererName = PHPExcel_Settings::PDF_RENDERER_MPDF; -$rendererName = PHPExcel_Settings::PDF_RENDERER_DOMPDF; -//$rendererLibrary = 'tcPDF5.9'; -//$rendererLibrary = 'mPDF5.4'; -$rendererLibrary = 'domPDF0.6.0beta3'; -$rendererLibraryPath = '/php/libraries/PDF/' . $rendererLibrary; - - -// Read from Excel2007 (.xlsx) template -echo date('H:i:s') , " Load Excel2007 template file" , EOL; -$objReader = PHPExcel_IOFactory::createReader('Excel2007'); -$objPHPExcel = $objReader->load("templates/26template.xlsx"); - -/** at this point, we could do some manipulations with the template, but we skip this step */ - -// Export to Excel2007 (.xlsx) -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - -// Export to Excel5 (.xls) -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - -// Export to HTML (.html) -echo date('H:i:s') , " Write to HTML format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'HTML'); -$objWriter->save(str_replace('.php', '.htm', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.htm', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - -// Export to PDF (.pdf) -echo date('H:i:s') , " Write to PDF format" , EOL; -try { - if (!PHPExcel_Settings::setPdfRenderer( - $rendererName, - $rendererLibraryPath - )) { - echo ( - 'NOTICE: Please set the $rendererName and $rendererLibraryPath values' . - EOL . - 'at the top of this script as appropriate for your directory structure' . - EOL - ); - } else { - $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF'); - $objWriter->save(str_replace('.php', '.pdf', __FILE__)); - echo date('H:i:s') , " File written to " , str_replace('.php', '.pdf', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - } -} catch (Exception $e) { - echo date('H:i:s') , ' EXCEPTION: ', $e->getMessage() , EOL; -} - -// Remove first two rows with field headers before exporting to CSV -echo date('H:i:s') , " Removing first two heading rows for CSV export" , EOL; -$objWorksheet = $objPHPExcel->getActiveSheet(); -$objWorksheet->removeRow(1, 2); - -// Export to CSV (.csv) -echo date('H:i:s') , " Write to CSV format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV'); -$objWriter->save(str_replace('.php', '.csv', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.csv', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - -// Export to CSV with BOM (.csv) -echo date('H:i:s') , " Write to CSV format (with BOM)" , EOL; -$objWriter->setUseBOM(true); -$objWriter->save(str_replace('.php', '-bom.csv', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '-bom.csv', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/27imagesexcel5.php b/htdocs/includes/phpoffice/phpexcel/Examples/27imagesexcel5.php deleted file mode 100644 index 17db771c3b4..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/27imagesexcel5.php +++ /dev/null @@ -1,64 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Read from Excel5 (.xls) template -echo date('H:i:s') , " Load Excel2007 template file" , EOL; -$objReader = PHPExcel_IOFactory::createReader('Excel5'); -$objPHPExcel = $objReader->load("templates/27template.xls"); - -// Export to Excel2007 (.xlsx) -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - -// Export to Excel5 (.xls) -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/28iterator.php b/htdocs/includes/phpoffice/phpexcel/Examples/28iterator.php deleted file mode 100644 index 3e1e681de37..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/28iterator.php +++ /dev/null @@ -1,68 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** PHPExcel_IOFactory */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php'; - - -if (!file_exists("05featuredemo.xlsx")) { - exit("Please run 05featuredemo.php first." . EOL); -} - -echo date('H:i:s') , " Load from Excel2007 file" , EOL; -$objReader = PHPExcel_IOFactory::createReader('Excel2007'); -$objPHPExcel = $objReader->load("05featuredemo.xlsx"); - -echo date('H:i:s') , " Iterate worksheets" , EOL; -foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) { - echo 'Worksheet - ' , $worksheet->getTitle() , EOL; - - foreach ($worksheet->getRowIterator() as $row) { - echo ' Row number - ' , $row->getRowIndex() , EOL; - - $cellIterator = $row->getCellIterator(); - $cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set - foreach ($cellIterator as $cell) { - if (!is_null($cell)) { - echo ' Cell - ' , $cell->getCoordinate() , ' - ' , $cell->getCalculatedValue() , EOL; - } - } - } -} - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/29advancedvaluebinder.php b/htdocs/includes/phpoffice/phpexcel/Examples/29advancedvaluebinder.php deleted file mode 100644 index bb387f9cd1d..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/29advancedvaluebinder.php +++ /dev/null @@ -1,183 +0,0 @@ -'); - -/** PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Set timezone -echo date('H:i:s') , " Set timezone" , EOL; -date_default_timezone_set('UTC'); - -// Set value binder -echo date('H:i:s') , " Set value binder" , EOL; -PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_AdvancedValueBinder() ); - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") - ->setKeywords("office 2007 openxml php") - ->setCategory("Test result file"); - -// Set default font -echo date('H:i:s') , " Set default font" , EOL; -$objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setName('Arial'); -$objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setSize(10); - -// Set column widths -echo date('H:i:s') , " Set column widths" , EOL; -$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setAutoSize(true); -$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(14); - -// Add some data, resembling some different data types -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->getActiveSheet()->setCellValue('A1', 'String value:') - ->setCellValue('B1', 'Mark Baker'); - -$objPHPExcel->getActiveSheet()->setCellValue('A2', 'Numeric value #1:') - ->setCellValue('B2', 12345); - -$objPHPExcel->getActiveSheet()->setCellValue('A3', 'Numeric value #2:') - ->setCellValue('B3', -12.345); - -$objPHPExcel->getActiveSheet()->setCellValue('A4', 'Numeric value #3:') - ->setCellValue('B4', .12345); - -$objPHPExcel->getActiveSheet()->setCellValue('A5', 'Numeric value #4:') - ->setCellValue('B5', '12345'); - -$objPHPExcel->getActiveSheet()->setCellValue('A6', 'Numeric value #5:') - ->setCellValue('B6', '1.2345'); - -$objPHPExcel->getActiveSheet()->setCellValue('A7', 'Numeric value #6:') - ->setCellValue('B7', '.12345'); - -$objPHPExcel->getActiveSheet()->setCellValue('A8', 'Numeric value #7:') - ->setCellValue('B8', '1.234e-5'); - -$objPHPExcel->getActiveSheet()->setCellValue('A9', 'Numeric value #8:') - ->setCellValue('B9', '-1.234e+5'); - -$objPHPExcel->getActiveSheet()->setCellValue('A10', 'Boolean value:') - ->setCellValue('B10', 'TRUE'); - -$objPHPExcel->getActiveSheet()->setCellValue('A11', 'Percentage value #1:') - ->setCellValue('B11', '10%'); - -$objPHPExcel->getActiveSheet()->setCellValue('A12', 'Percentage value #2:') - ->setCellValue('B12', '12.5%'); - -$objPHPExcel->getActiveSheet()->setCellValue('A13', 'Fraction value #1:') - ->setCellValue('B13', '-1/2'); - -$objPHPExcel->getActiveSheet()->setCellValue('A14', 'Fraction value #2:') - ->setCellValue('B14', '3 1/2'); - -$objPHPExcel->getActiveSheet()->setCellValue('A15', 'Fraction value #3:') - ->setCellValue('B15', '-12 3/4'); - -$objPHPExcel->getActiveSheet()->setCellValue('A16', 'Fraction value #4:') - ->setCellValue('B16', '13/4'); - -$objPHPExcel->getActiveSheet()->setCellValue('A17', 'Currency value #1:') - ->setCellValue('B17', '$12345'); - -$objPHPExcel->getActiveSheet()->setCellValue('A18', 'Currency value #2:') - ->setCellValue('B18', '$12345.67'); - -$objPHPExcel->getActiveSheet()->setCellValue('A19', 'Currency value #3:') - ->setCellValue('B19', '$12,345.67'); - -$objPHPExcel->getActiveSheet()->setCellValue('A20', 'Date value #1:') - ->setCellValue('B20', '21 December 1983'); - -$objPHPExcel->getActiveSheet()->setCellValue('A21', 'Date value #2:') - ->setCellValue('B21', '19-Dec-1960'); - -$objPHPExcel->getActiveSheet()->setCellValue('A22', 'Date value #3:') - ->setCellValue('B22', '07/12/1982'); - -$objPHPExcel->getActiveSheet()->setCellValue('A23', 'Date value #4:') - ->setCellValue('B23', '24-11-1950'); - -$objPHPExcel->getActiveSheet()->setCellValue('A24', 'Date value #5:') - ->setCellValue('B24', '17-Mar'); - -$objPHPExcel->getActiveSheet()->setCellValue('A25', 'Time value #1:') - ->setCellValue('B25', '01:30'); - -$objPHPExcel->getActiveSheet()->setCellValue('A26', 'Time value #2:') - ->setCellValue('B26', '01:30:15'); - -$objPHPExcel->getActiveSheet()->setCellValue('A27', 'Date/Time value:') - ->setCellValue('B27', '19-Dec-1960 01:30'); - -$objPHPExcel->getActiveSheet()->setCellValue('A28', 'Formula:') - ->setCellValue('B28', '=SUM(B2:B9)'); - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Advanced value binder'); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -// Save Excel5 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/30template.php b/htdocs/includes/phpoffice/phpexcel/Examples/30template.php deleted file mode 100644 index 2b66c2ceb41..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/30template.php +++ /dev/null @@ -1,91 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** PHPExcel_IOFactory */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php'; - - - -echo date('H:i:s') , " Load from Excel5 template" , EOL; -$objReader = PHPExcel_IOFactory::createReader('Excel5'); -$objPHPExcel = $objReader->load("templates/30template.xls"); - - - - -echo date('H:i:s') , " Add new data to the template" , EOL; -$data = array(array('title' => 'Excel for dummies', - 'price' => 17.99, - 'quantity' => 2 - ), - array('title' => 'PHP for dummies', - 'price' => 15.99, - 'quantity' => 1 - ), - array('title' => 'Inside OOP', - 'price' => 12.95, - 'quantity' => 1 - ) - ); - -$objPHPExcel->getActiveSheet()->setCellValue('D1', PHPExcel_Shared_Date::PHPToExcel(time())); - -$baseRow = 5; -foreach($data as $r => $dataRow) { - $row = $baseRow + $r; - $objPHPExcel->getActiveSheet()->insertNewRowBefore($row,1); - - $objPHPExcel->getActiveSheet()->setCellValue('A'.$row, $r+1) - ->setCellValue('B'.$row, $dataRow['title']) - ->setCellValue('C'.$row, $dataRow['price']) - ->setCellValue('D'.$row, $dataRow['quantity']) - ->setCellValue('E'.$row, '=C'.$row.'*D'.$row); -} -$objPHPExcel->getActiveSheet()->removeRow($baseRow-1,1); - - -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/31docproperties_write-xls.php b/htdocs/includes/phpoffice/phpexcel/Examples/31docproperties_write-xls.php deleted file mode 100644 index f3ad0a4bdb7..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/31docproperties_write-xls.php +++ /dev/null @@ -1,119 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -$inputFileType = 'Excel5'; -$inputFileName = 'templates/31docproperties.xls'; - - -echo date('H:i:s') , " Load Tests from $inputFileType file" , EOL; -$callStartTime = microtime(true); - -$objPHPExcelReader = PHPExcel_IOFactory::createReader($inputFileType); -$objPHPExcel = $objPHPExcelReader->load($inputFileName); - -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; -echo 'Call time to read Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -echo date('H:i:s') , " Adjust properties" , EOL; -$objPHPExcel->getProperties()->setTitle("Office 95 XLS Test Document") - ->setSubject("Office 95 XLS Test Document") - ->setDescription("Test XLS document, generated using PHPExcel") - ->setKeywords("office 95 biff php"); - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " . (memory_get_peak_usage(true) / 1024 / 1024) . " MB" , EOL; - - -echo EOL; -// Reread File -echo date('H:i:s') , " Reread Excel5 file" , EOL; -$objPHPExcelRead = PHPExcel_IOFactory::load(str_replace('.php', '.xls', __FILE__)); - -// Set properties -echo date('H:i:s') , " Get properties" , EOL; - -echo 'Core Properties:' , EOL; -echo ' Created by - ' , $objPHPExcel->getProperties()->getCreator() , EOL; -echo ' Created on - ' , date('d-M-Y',$objPHPExcel->getProperties()->getCreated()) , ' at ' , - date('H:i:s',$objPHPExcel->getProperties()->getCreated()) , EOL; -echo ' Last Modified by - ' , $objPHPExcel->getProperties()->getLastModifiedBy() , EOL; -echo ' Last Modified on - ' , date('d-M-Y',$objPHPExcel->getProperties()->getModified()) , ' at ' , - date('H:i:s',$objPHPExcel->getProperties()->getModified()) , EOL; -echo ' Title - ' , $objPHPExcel->getProperties()->getTitle() , EOL; -echo ' Subject - ' , $objPHPExcel->getProperties()->getSubject() , EOL; -echo ' Description - ' , $objPHPExcel->getProperties()->getDescription() , EOL; -echo ' Keywords: - ' , $objPHPExcel->getProperties()->getKeywords() , EOL; - - -echo 'Extended (Application) Properties:' , EOL; -echo ' Category - ' , $objPHPExcel->getProperties()->getCategory() , EOL; -echo ' Company - ' , $objPHPExcel->getProperties()->getCompany() , EOL; -echo ' Manager - ' , $objPHPExcel->getProperties()->getManager() , EOL; - - -echo 'Custom Properties:' , EOL; -$customProperties = $objPHPExcel->getProperties()->getCustomProperties(); -foreach($customProperties as $customProperty) { - $propertyValue = $objPHPExcel->getProperties()->getCustomPropertyValue($customProperty); - $propertyType = $objPHPExcel->getProperties()->getCustomPropertyType($customProperty); - echo ' ' , $customProperty , ' - (' , $propertyType , ') - '; - if ($propertyType == PHPExcel_DocumentProperties::PROPERTY_TYPE_DATE) { - echo date('d-M-Y H:i:s',$propertyValue) , EOL; - } elseif ($propertyType == PHPExcel_DocumentProperties::PROPERTY_TYPE_BOOLEAN) { - echo (($propertyValue) ? 'TRUE' : 'FALSE') , EOL; - } else { - echo $propertyValue , EOL; - } -} - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) . " MB" , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/31docproperties_write.php b/htdocs/includes/phpoffice/phpexcel/Examples/31docproperties_write.php deleted file mode 100644 index 3f5328c5ec3..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/31docproperties_write.php +++ /dev/null @@ -1,119 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -$inputFileType = 'Excel2007'; -$inputFileName = 'templates/31docproperties.xlsx'; - - -echo date('H:i:s') , " Load Tests from $inputFileType file" , EOL; -$callStartTime = microtime(true); - -$objPHPExcelReader = PHPExcel_IOFactory::createReader($inputFileType); -$objPHPExcel = $objPHPExcelReader->load($inputFileName); - -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; -echo 'Call time to read Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -echo date('H:i:s') , " Adjust properties" , EOL; -$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document") - ->setSubject("Office 2007 XLSX Test Document") - ->setDescription("Test XLSX document, generated using PHPExcel") - ->setKeywords("office 2007 openxml php"); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " . (memory_get_peak_usage(true) / 1024 / 1024) . " MB" , EOL; - - -echo EOL; -// Reread File -echo date('H:i:s') , " Reread Excel2007 file" , EOL; -$objPHPExcelRead = PHPExcel_IOFactory::load(str_replace('.php', '.xlsx', __FILE__)); - -// Set properties -echo date('H:i:s') , " Get properties" , EOL; - -echo 'Core Properties:' , EOL; -echo ' Created by - ' , $objPHPExcel->getProperties()->getCreator() , EOL; -echo ' Created on - ' , date('d-M-Y',$objPHPExcel->getProperties()->getCreated()) , ' at ' , - date('H:i:s',$objPHPExcel->getProperties()->getCreated()) , EOL; -echo ' Last Modified by - ' , $objPHPExcel->getProperties()->getLastModifiedBy() , EOL; -echo ' Last Modified on - ' , date('d-M-Y',$objPHPExcel->getProperties()->getModified()) , ' at ' , - date('H:i:s',$objPHPExcel->getProperties()->getModified()) , EOL; -echo ' Title - ' , $objPHPExcel->getProperties()->getTitle() , EOL; -echo ' Subject - ' , $objPHPExcel->getProperties()->getSubject() , EOL; -echo ' Description - ' , $objPHPExcel->getProperties()->getDescription() , EOL; -echo ' Keywords: - ' , $objPHPExcel->getProperties()->getKeywords() , EOL; - - -echo 'Extended (Application) Properties:' , EOL; -echo ' Category - ' , $objPHPExcel->getProperties()->getCategory() , EOL; -echo ' Company - ' , $objPHPExcel->getProperties()->getCompany() , EOL; -echo ' Manager - ' , $objPHPExcel->getProperties()->getManager() , EOL; - - -echo 'Custom Properties:' , EOL; -$customProperties = $objPHPExcel->getProperties()->getCustomProperties(); -foreach($customProperties as $customProperty) { - $propertyValue = $objPHPExcel->getProperties()->getCustomPropertyValue($customProperty); - $propertyType = $objPHPExcel->getProperties()->getCustomPropertyType($customProperty); - echo ' ' , $customProperty , ' - (' , $propertyType , ') - '; - if ($propertyType == PHPExcel_DocumentProperties::PROPERTY_TYPE_DATE) { - echo date('d-M-Y H:i:s',$propertyValue) , EOL; - } elseif ($propertyType == PHPExcel_DocumentProperties::PROPERTY_TYPE_BOOLEAN) { - echo (($propertyValue) ? 'TRUE' : 'FALSE') , EOL; - } else { - echo $propertyValue , EOL; - } -} - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) . " MB" , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/32chartreadwrite.php b/htdocs/includes/phpoffice/phpexcel/Examples/32chartreadwrite.php deleted file mode 100644 index be1925a5b4f..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/32chartreadwrite.php +++ /dev/null @@ -1,131 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** Include path **/ -set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/../Classes/'); - -/** PHPExcel_IOFactory */ -include 'PHPExcel/IOFactory.php'; - -$inputFileType = 'Excel2007'; -$inputFileNames = 'templates/32readwrite*[0-9].xlsx'; - -if ((isset($argc)) && ($argc > 1)) { - $inputFileNames = array(); - for($i = 1; $i < $argc; ++$i) { - $inputFileNames[] = dirname(__FILE__) . '/templates/' . $argv[$i]; - } -} else { - $inputFileNames = glob($inputFileNames); -} -foreach($inputFileNames as $inputFileName) { - $inputFileNameShort = basename($inputFileName); - - if (!file_exists($inputFileName)) { - echo date('H:i:s') , " File " , $inputFileNameShort , ' does not exist' , EOL; - continue; - } - - echo date('H:i:s') , " Load Test from $inputFileType file " , $inputFileNameShort , EOL; - - $objReader = PHPExcel_IOFactory::createReader($inputFileType); - $objReader->setIncludeCharts(TRUE); - $objPHPExcel = $objReader->load($inputFileName); - - - echo date('H:i:s') , " Iterate worksheets looking at the charts" , EOL; - foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) { - $sheetName = $worksheet->getTitle(); - echo 'Worksheet: ' , $sheetName , EOL; - - $chartNames = $worksheet->getChartNames(); - if(empty($chartNames)) { - echo ' There are no charts in this worksheet' , EOL; - } else { - natsort($chartNames); - foreach($chartNames as $i => $chartName) { - $chart = $worksheet->getChartByName($chartName); - if (!is_null($chart->getTitle())) { - $caption = '"' . implode(' ',$chart->getTitle()->getCaption()) . '"'; - } else { - $caption = 'Untitled'; - } - echo ' ' , $chartName , ' - ' , $caption , EOL; - echo str_repeat(' ',strlen($chartName)+3); - $groupCount = $chart->getPlotArea()->getPlotGroupCount(); - if ($groupCount == 1) { - $chartType = $chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotType(); - echo ' ' , $chartType , EOL; - } else { - $chartTypes = array(); - for($i = 0; $i < $groupCount; ++$i) { - $chartTypes[] = $chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType(); - } - $chartTypes = array_unique($chartTypes); - if (count($chartTypes) == 1) { - $chartType = 'Multiple Plot ' . array_pop($chartTypes); - echo ' ' , $chartType , EOL; - } elseif (count($chartTypes) == 0) { - echo ' *** Type not yet implemented' , EOL; - } else { - echo ' Combination Chart' , EOL; - } - } - } - } - } - - - $outputFileName = basename($inputFileName); - - echo date('H:i:s') , " Write Tests to Excel2007 file " , EOL; - $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); - $objWriter->setIncludeCharts(TRUE); - $objWriter->save($outputFileName); - echo date('H:i:s') , " File written to " , $outputFileName , EOL; - - $objPHPExcel->disconnectWorksheets(); - unset($objPHPExcel); -} - -// Echo memory peak usage -echo date('H:i:s') , ' Peak memory usage: ' , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-area.php b/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-area.php deleted file mode 100644 index 53fe52398d2..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-area.php +++ /dev/null @@ -1,142 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -$objPHPExcel = new PHPExcel(); -$objWorksheet = $objPHPExcel->getActiveSheet(); -$objWorksheet->fromArray( - array( - array('', 2010, 2011, 2012), - array('Q1', 12, 15, 21), - array('Q2', 56, 73, 86), - array('Q3', 52, 61, 69), - array('Q4', 30, 32, 0), - ) -); - -// Set the Labels for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesLabels = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), // 2010 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), // 2011 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), // 2012 -); -// Set the X-Axis Labels -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$xAxisTickValues = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$5', NULL, 4), // Q1 to Q4 -); -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$5', NULL, 4), -); - -// Build the dataseries -$series = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_AREACHART, // plotType - PHPExcel_Chart_DataSeries::GROUPING_PERCENT_STACKED, // plotGrouping - range(0, count($dataSeriesValues)-1), // plotOrder - $dataSeriesLabels, // plotLabel - $xAxisTickValues, // plotCategory - $dataSeriesValues // plotValues -); - -// Set the series in the plot area -$plotArea = new PHPExcel_Chart_PlotArea(NULL, array($series)); -// Set the chart legend -$legend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false); - -$title = new PHPExcel_Chart_Title('Test %age-Stacked Area Chart'); -$yAxisLabel = new PHPExcel_Chart_Title('Value ($k)'); - - -// Create the chart -$chart = new PHPExcel_Chart( - 'chart1', // name - $title, // title - $legend, // legend - $plotArea, // plotArea - true, // plotVisibleOnly - 0, // displayBlanksAs - NULL, // xAxisLabel - $yAxisLabel // yAxisLabel -); - -// Set the position where the chart should appear in the worksheet -$chart->setTopLeftPosition('A7'); -$chart->setBottomRightPosition('H20'); - -// Add the chart to the worksheet -$objWorksheet->addChart($chart); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->setIncludeCharts(TRUE); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-bar-stacked.php b/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-bar-stacked.php deleted file mode 100644 index cac29f29f55..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-bar-stacked.php +++ /dev/null @@ -1,145 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -$objPHPExcel = new PHPExcel(); -$objWorksheet = $objPHPExcel->getActiveSheet(); -$objWorksheet->fromArray( - array( - array('', 2010, 2011, 2012), - array('Q1', 12, 15, 21), - array('Q2', 56, 73, 86), - array('Q3', 52, 61, 69), - array('Q4', 30, 32, 0), - ) -); - -// Set the Labels for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesLabels = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), // 2010 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), // 2011 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), // 2012 -); -// Set the X-Axis Labels -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$xAxisTickValues = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$5', NULL, 4), // Q1 to Q4 -); -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$5', NULL, 4), -); - -// Build the dataseries -$series = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_BARCHART, // plotType - PHPExcel_Chart_DataSeries::GROUPING_STACKED, // plotGrouping - range(0, count($dataSeriesValues)-1), // plotOrder - $dataSeriesLabels, // plotLabel - $xAxisTickValues, // plotCategory - $dataSeriesValues // plotValues -); -// Set additional dataseries parameters -// Make it a horizontal bar rather than a vertical column graph -$series->setPlotDirection(PHPExcel_Chart_DataSeries::DIRECTION_BAR); - -// Set the series in the plot area -$plotArea = new PHPExcel_Chart_PlotArea(NULL, array($series)); -// Set the chart legend -$legend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_RIGHT, NULL, false); - -$title = new PHPExcel_Chart_Title('Test Chart'); -$yAxisLabel = new PHPExcel_Chart_Title('Value ($k)'); - - -// Create the chart -$chart = new PHPExcel_Chart( - 'chart1', // name - $title, // title - $legend, // legend - $plotArea, // plotArea - true, // plotVisibleOnly - 0, // displayBlanksAs - NULL, // xAxisLabel - $yAxisLabel // yAxisLabel -); - -// Set the position where the chart should appear in the worksheet -$chart->setTopLeftPosition('A7'); -$chart->setBottomRightPosition('H20'); - -// Add the chart to the worksheet -$objWorksheet->addChart($chart); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->setIncludeCharts(TRUE); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-bar.php b/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-bar.php deleted file mode 100644 index 14fd5d485f9..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-bar.php +++ /dev/null @@ -1,145 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -$objPHPExcel = new PHPExcel(); -$objWorksheet = $objPHPExcel->getActiveSheet(); -$objWorksheet->fromArray( - array( - array('', 2010, 2011, 2012), - array('Q1', 12, 15, 21), - array('Q2', 56, 73, 86), - array('Q3', 52, 61, 69), - array('Q4', 30, 32, 0), - ) -); - -// Set the Labels for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesLabels = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), // 2010 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), // 2011 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), // 2012 -); -// Set the X-Axis Labels -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$xAxisTickValues = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$5', NULL, 4), // Q1 to Q4 -); -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$5', NULL, 4), -); - -// Build the dataseries -$series = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_BARCHART, // plotType - PHPExcel_Chart_DataSeries::GROUPING_CLUSTERED, // plotGrouping - range(0, count($dataSeriesValues)-1), // plotOrder - $dataSeriesLabels, // plotLabel - $xAxisTickValues, // plotCategory - $dataSeriesValues // plotValues -); -// Set additional dataseries parameters -// Make it a horizontal bar rather than a vertical column graph -$series->setPlotDirection(PHPExcel_Chart_DataSeries::DIRECTION_BAR); - -// Set the series in the plot area -$plotArea = new PHPExcel_Chart_PlotArea(NULL, array($series)); -// Set the chart legend -$legend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_RIGHT, NULL, false); - -$title = new PHPExcel_Chart_Title('Test Bar Chart'); -$yAxisLabel = new PHPExcel_Chart_Title('Value ($k)'); - - -// Create the chart -$chart = new PHPExcel_Chart( - 'chart1', // name - $title, // title - $legend, // legend - $plotArea, // plotArea - true, // plotVisibleOnly - 0, // displayBlanksAs - NULL, // xAxisLabel - $yAxisLabel // yAxisLabel -); - -// Set the position where the chart should appear in the worksheet -$chart->setTopLeftPosition('A7'); -$chart->setBottomRightPosition('H20'); - -// Add the chart to the worksheet -$objWorksheet->addChart($chart); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->setIncludeCharts(TRUE); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-column-2.php b/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-column-2.php deleted file mode 100644 index 00bf0d71b50..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-column-2.php +++ /dev/null @@ -1,154 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -$objPHPExcel = new PHPExcel(); -$objWorksheet = $objPHPExcel->getActiveSheet(); -$objWorksheet->fromArray( - array( - array('', '', 'Budget', 'Forecast', 'Actual'), - array('2010', 'Q1', 47, 44, 43 ), - array('', 'Q2', 56, 53, 50 ), - array('', 'Q3', 52, 46, 45 ), - array('', 'Q4', 45, 40, 40 ), - array('2011', 'Q1', 51, 42, 46 ), - array('', 'Q2', 53, 58, 56 ), - array('', 'Q3', 64, 66, 69 ), - array('', 'Q4', 54, 55, 56 ), - array('2012', 'Q1', 49, 52, 58 ), - array('', 'Q2', 68, 73, 86 ), - array('', 'Q3', 72, 78, 0 ), - array('', 'Q4', 50, 60, 0 ), - ) -); - -// Set the Labels for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesLabels = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), // 'Budget' - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), // 'Forecast' - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$E$1', NULL, 1), // 'Actual' -); -// Set the X-Axis Labels -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$xAxisTickValues = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$B$13', NULL, 12), // Q1 to Q4 for 2010 to 2012 -); -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$13', NULL, 12), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$13', NULL, 12), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$E$2:$E$13', NULL, 12), -); - -// Build the dataseries -$series = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_BARCHART, // plotType - PHPExcel_Chart_DataSeries::GROUPING_CLUSTERED, // plotGrouping - range(0, count($dataSeriesValues)-1), // plotOrder - $dataSeriesLabels, // plotLabel - $xAxisTickValues, // plotCategory - $dataSeriesValues // plotValues -); -// Set additional dataseries parameters -// Make it a vertical column rather than a horizontal bar graph -$series->setPlotDirection(PHPExcel_Chart_DataSeries::DIRECTION_COL); - -// Set the series in the plot area -$plotArea = new PHPExcel_Chart_PlotArea(NULL, array($series)); -// Set the chart legend -$legend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_BOTTOM, NULL, false); - -$title = new PHPExcel_Chart_Title('Test Grouped Column Chart'); -$xAxisLabel = new PHPExcel_Chart_Title('Financial Period'); -$yAxisLabel = new PHPExcel_Chart_Title('Value ($k)'); - - -// Create the chart -$chart = new PHPExcel_Chart( - 'chart1', // name - $title, // title - $legend, // legend - $plotArea, // plotArea - true, // plotVisibleOnly - 0, // displayBlanksAs - $xAxisLabel, // xAxisLabel - $yAxisLabel // yAxisLabel -); - -// Set the position where the chart should appear in the worksheet -$chart->setTopLeftPosition('G2'); -$chart->setBottomRightPosition('P20'); - -// Add the chart to the worksheet -$objWorksheet->addChart($chart); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->setIncludeCharts(TRUE); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-column.php b/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-column.php deleted file mode 100644 index ae9c6185e26..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-column.php +++ /dev/null @@ -1,145 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -$objPHPExcel = new PHPExcel(); -$objWorksheet = $objPHPExcel->getActiveSheet(); -$objWorksheet->fromArray( - array( - array('', 2010, 2011, 2012), - array('Q1', 12, 15, 21), - array('Q2', 56, 73, 86), - array('Q3', 52, 61, 69), - array('Q4', 30, 32, 0), - ) -); - -// Set the Labels for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesLabels = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), // 2010 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), // 2011 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), // 2012 -); -// Set the X-Axis Labels -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$xAxisTickValues = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$5', NULL, 4), // Q1 to Q4 -); -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$5', NULL, 4), -); - -// Build the dataseries -$series = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_BARCHART, // plotType - PHPExcel_Chart_DataSeries::GROUPING_STANDARD, // plotGrouping - range(0, count($dataSeriesValues)-1), // plotOrder - $dataSeriesLabels, // plotLabel - $xAxisTickValues, // plotCategory - $dataSeriesValues // plotValues -); -// Set additional dataseries parameters -// Make it a vertical column rather than a horizontal bar graph -$series->setPlotDirection(PHPExcel_Chart_DataSeries::DIRECTION_COL); - -// Set the series in the plot area -$plotArea = new PHPExcel_Chart_PlotArea(NULL, array($series)); -// Set the chart legend -$legend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_RIGHT, NULL, false); - -$title = new PHPExcel_Chart_Title('Test Column Chart'); -$yAxisLabel = new PHPExcel_Chart_Title('Value ($k)'); - - -// Create the chart -$chart = new PHPExcel_Chart( - 'chart1', // name - $title, // title - $legend, // legend - $plotArea, // plotArea - true, // plotVisibleOnly - 0, // displayBlanksAs - NULL, // xAxisLabel - $yAxisLabel // yAxisLabel -); - -// Set the position where the chart should appear in the worksheet -$chart->setTopLeftPosition('A7'); -$chart->setBottomRightPosition('H20'); - -// Add the chart to the worksheet -$objWorksheet->addChart($chart); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->setIncludeCharts(TRUE); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-composite.php b/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-composite.php deleted file mode 100644 index 8ea72126ccb..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-composite.php +++ /dev/null @@ -1,203 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -$objPHPExcel = new PHPExcel(); -$objWorksheet = $objPHPExcel->getActiveSheet(); -$objWorksheet->fromArray( - array( - array('', 'Rainfall (mm)', 'Temperature (°F)', 'Humidity (%)'), - array('Jan', 78, 52, 61), - array('Feb', 64, 54, 62), - array('Mar', 62, 57, 63), - array('Apr', 21, 62, 59), - array('May', 11, 75, 60), - array('Jun', 1, 75, 57), - array('Jul', 1, 79, 56), - array('Aug', 1, 79, 59), - array('Sep', 10, 75, 60), - array('Oct', 40, 68, 63), - array('Nov', 69, 62, 64), - array('Dec', 89, 57, 66), - ) -); - - -// Set the Labels for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesLabels1 = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), // Temperature -); -$dataSeriesLabels2 = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), // Rainfall -); -$dataSeriesLabels3 = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), // Humidity -); - -// Set the X-Axis Labels -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$xAxisTickValues = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$13', NULL, 12), // Jan to Dec -); - - -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues1 = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$13', NULL, 12), -); - -// Build the dataseries -$series1 = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_BARCHART, // plotType - PHPExcel_Chart_DataSeries::GROUPING_CLUSTERED, // plotGrouping - range(0, count($dataSeriesValues1)-1), // plotOrder - $dataSeriesLabels1, // plotLabel - $xAxisTickValues, // plotCategory - $dataSeriesValues1 // plotValues -); -// Set additional dataseries parameters -// Make it a vertical column rather than a horizontal bar graph -$series1->setPlotDirection(PHPExcel_Chart_DataSeries::DIRECTION_COL); - - -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues2 = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$13', NULL, 12), -); - -// Build the dataseries -$series2 = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_LINECHART, // plotType - PHPExcel_Chart_DataSeries::GROUPING_STANDARD, // plotGrouping - range(0, count($dataSeriesValues2)-1), // plotOrder - $dataSeriesLabels2, // plotLabel - NULL, // plotCategory - $dataSeriesValues2 // plotValues -); - - -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues3 = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$13', NULL, 12), -); - -// Build the dataseries -$series3 = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_AREACHART, // plotType - PHPExcel_Chart_DataSeries::GROUPING_STANDARD, // plotGrouping - range(0, count($dataSeriesValues2)-1), // plotOrder - $dataSeriesLabels3, // plotLabel - NULL, // plotCategory - $dataSeriesValues3 // plotValues -); - - -// Set the series in the plot area -$plotArea = new PHPExcel_Chart_PlotArea(NULL, array($series1, $series2, $series3)); -// Set the chart legend -$legend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_RIGHT, NULL, false); - -$title = new PHPExcel_Chart_Title('Average Weather Chart for Crete'); - - -// Create the chart -$chart = new PHPExcel_Chart( - 'chart1', // name - $title, // title - $legend, // legend - $plotArea, // plotArea - true, // plotVisibleOnly - 0, // displayBlanksAs - NULL, // xAxisLabel - NULL // yAxisLabel -); - -// Set the position where the chart should appear in the worksheet -$chart->setTopLeftPosition('F2'); -$chart->setBottomRightPosition('O16'); - -// Add the chart to the worksheet -$objWorksheet->addChart($chart); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->setIncludeCharts(TRUE); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-line.php b/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-line.php deleted file mode 100644 index 145ae72e8fd..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-line.php +++ /dev/null @@ -1,142 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -$objPHPExcel = new PHPExcel(); -$objWorksheet = $objPHPExcel->getActiveSheet(); -$objWorksheet->fromArray( - array( - array('', 2010, 2011, 2012), - array('Q1', 12, 15, 21), - array('Q2', 56, 73, 86), - array('Q3', 52, 61, 69), - array('Q4', 30, 32, 0), - ) -); - -// Set the Labels for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesLabels = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), // 2010 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), // 2011 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), // 2012 -); -// Set the X-Axis Labels -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$xAxisTickValues = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$5', NULL, 4), // Q1 to Q4 -); -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$5', NULL, 4), -); - -// Build the dataseries -$series = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_LINECHART, // plotType - PHPExcel_Chart_DataSeries::GROUPING_STACKED, // plotGrouping - range(0, count($dataSeriesValues)-1), // plotOrder - $dataSeriesLabels, // plotLabel - $xAxisTickValues, // plotCategory - $dataSeriesValues // plotValues -); - -// Set the series in the plot area -$plotArea = new PHPExcel_Chart_PlotArea(NULL, array($series)); -// Set the chart legend -$legend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false); - -$title = new PHPExcel_Chart_Title('Test Stacked Line Chart'); -$yAxisLabel = new PHPExcel_Chart_Title('Value ($k)'); - - -// Create the chart -$chart = new PHPExcel_Chart( - 'chart1', // name - $title, // title - $legend, // legend - $plotArea, // plotArea - true, // plotVisibleOnly - 0, // displayBlanksAs - NULL, // xAxisLabel - $yAxisLabel // yAxisLabel -); - -// Set the position where the chart should appear in the worksheet -$chart->setTopLeftPosition('A7'); -$chart->setBottomRightPosition('H20'); - -// Add the chart to the worksheet -$objWorksheet->addChart($chart); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->setIncludeCharts(TRUE); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-multiple-charts.php b/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-multiple-charts.php deleted file mode 100644 index a95c2763323..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-multiple-charts.php +++ /dev/null @@ -1,220 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -$objPHPExcel = new PHPExcel(); -$objWorksheet = $objPHPExcel->getActiveSheet(); -$objWorksheet->fromArray( - array( - array('', 2010, 2011, 2012), - array('Q1', 12, 15, 21), - array('Q2', 56, 73, 86), - array('Q3', 52, 61, 69), - array('Q4', 30, 32, 0), - ) -); - - -// Set the Labels for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesLabels1 = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), // 2010 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), // 2011 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), // 2012 -); -// Set the X-Axis Labels -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$xAxisTickValues1 = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$5', NULL, 4), // Q1 to Q4 -); -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues1 = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$5', NULL, 4), -); - -// Build the dataseries -$series1 = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_AREACHART, // plotType - PHPExcel_Chart_DataSeries::GROUPING_PERCENT_STACKED, // plotGrouping - range(0, count($dataSeriesValues1)-1), // plotOrder - $dataSeriesLabels1, // plotLabel - $xAxisTickValues1, // plotCategory - $dataSeriesValues1 // plotValues -); - -// Set the series in the plot area -$plotArea1 = new PHPExcel_Chart_PlotArea(NULL, array($series1)); -// Set the chart legend -$legend1 = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false); - -$title1 = new PHPExcel_Chart_Title('Test %age-Stacked Area Chart'); -$yAxisLabel1 = new PHPExcel_Chart_Title('Value ($k)'); - - -// Create the chart -$chart1 = new PHPExcel_Chart( - 'chart1', // name - $title1, // title - $legend1, // legend - $plotArea1, // plotArea - true, // plotVisibleOnly - 0, // displayBlanksAs - NULL, // xAxisLabel - $yAxisLabel1 // yAxisLabel -); - -// Set the position where the chart should appear in the worksheet -$chart1->setTopLeftPosition('A7'); -$chart1->setBottomRightPosition('H20'); - -// Add the chart to the worksheet -$objWorksheet->addChart($chart1); - - -// Set the Labels for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesLabels2 = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), // 2010 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), // 2011 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), // 2012 -); -// Set the X-Axis Labels -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$xAxisTickValues2 = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$5', NULL, 4), // Q1 to Q4 -); -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues2 = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$5', NULL, 4), -); - -// Build the dataseries -$series2 = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_BARCHART, // plotType - PHPExcel_Chart_DataSeries::GROUPING_STANDARD, // plotGrouping - range(0, count($dataSeriesValues2)-1), // plotOrder - $dataSeriesLabels2, // plotLabel - $xAxisTickValues2, // plotCategory - $dataSeriesValues2 // plotValues -); -// Set additional dataseries parameters -// Make it a vertical column rather than a horizontal bar graph -$series2->setPlotDirection(PHPExcel_Chart_DataSeries::DIRECTION_COL); - -// Set the series in the plot area -$plotArea2 = new PHPExcel_Chart_PlotArea(NULL, array($series2)); -// Set the chart legend -$legend2 = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_RIGHT, NULL, false); - -$title2 = new PHPExcel_Chart_Title('Test Column Chart'); -$yAxisLabel2 = new PHPExcel_Chart_Title('Value ($k)'); - - -// Create the chart -$chart2 = new PHPExcel_Chart( - 'chart2', // name - $title2, // title - $legend2, // legend - $plotArea2, // plotArea - true, // plotVisibleOnly - 0, // displayBlanksAs - NULL, // xAxisLabel - $yAxisLabel2 // yAxisLabel -); - -// Set the position where the chart should appear in the worksheet -$chart2->setTopLeftPosition('I7'); -$chart2->setBottomRightPosition('P20'); - -// Add the chart to the worksheet -$objWorksheet->addChart($chart2); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->setIncludeCharts(TRUE); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-pie.php b/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-pie.php deleted file mode 100644 index 5af02905bfc..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-pie.php +++ /dev/null @@ -1,215 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -$objPHPExcel = new PHPExcel(); -$objWorksheet = $objPHPExcel->getActiveSheet(); -$objWorksheet->fromArray( - array( - array('', 2010, 2011, 2012), - array('Q1', 12, 15, 21), - array('Q2', 56, 73, 86), - array('Q3', 52, 61, 69), - array('Q4', 30, 32, 0), - ) -); - - -// Set the Labels for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesLabels1 = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), // 2011 -); -// Set the X-Axis Labels -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$xAxisTickValues1 = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$5', NULL, 4), // Q1 to Q4 -); -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues1 = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$5', NULL, 4), -); - -// Build the dataseries -$series1 = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_PIECHART, // plotType - NULL, // plotGrouping (Pie charts don't have any grouping) - range(0, count($dataSeriesValues1)-1), // plotOrder - $dataSeriesLabels1, // plotLabel - $xAxisTickValues1, // plotCategory - $dataSeriesValues1 // plotValues -); - -// Set up a layout object for the Pie chart -$layout1 = new PHPExcel_Chart_Layout(); -$layout1->setShowVal(TRUE); -$layout1->setShowPercent(TRUE); - -// Set the series in the plot area -$plotArea1 = new PHPExcel_Chart_PlotArea($layout1, array($series1)); -// Set the chart legend -$legend1 = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_RIGHT, NULL, false); - -$title1 = new PHPExcel_Chart_Title('Test Pie Chart'); - - -// Create the chart -$chart1 = new PHPExcel_Chart( - 'chart1', // name - $title1, // title - $legend1, // legend - $plotArea1, // plotArea - true, // plotVisibleOnly - 0, // displayBlanksAs - NULL, // xAxisLabel - NULL // yAxisLabel - Pie charts don't have a Y-Axis -); - -// Set the position where the chart should appear in the worksheet -$chart1->setTopLeftPosition('A7'); -$chart1->setBottomRightPosition('H20'); - -// Add the chart to the worksheet -$objWorksheet->addChart($chart1); - - -// Set the Labels for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesLabels2 = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), // 2011 -); -// Set the X-Axis Labels -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$xAxisTickValues2 = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$5', NULL, 4), // Q1 to Q4 -); -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues2 = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$5', NULL, 4), -); - -// Build the dataseries -$series2 = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_DONUTCHART, // plotType - NULL, // plotGrouping (Donut charts don't have any grouping) - range(0, count($dataSeriesValues2)-1), // plotOrder - $dataSeriesLabels2, // plotLabel - $xAxisTickValues2, // plotCategory - $dataSeriesValues2 // plotValues -); - -// Set up a layout object for the Pie chart -$layout2 = new PHPExcel_Chart_Layout(); -$layout2->setShowVal(TRUE); -$layout2->setShowCatName(TRUE); - -// Set the series in the plot area -$plotArea2 = new PHPExcel_Chart_PlotArea($layout2, array($series2)); - -$title2 = new PHPExcel_Chart_Title('Test Donut Chart'); - - -// Create the chart -$chart2 = new PHPExcel_Chart( - 'chart2', // name - $title2, // title - NULL, // legend - $plotArea2, // plotArea - true, // plotVisibleOnly - 0, // displayBlanksAs - NULL, // xAxisLabel - NULL // yAxisLabel - Like Pie charts, Donut charts don't have a Y-Axis -); - -// Set the position where the chart should appear in the worksheet -$chart2->setTopLeftPosition('I7'); -$chart2->setBottomRightPosition('P20'); - -// Add the chart to the worksheet -$objWorksheet->addChart($chart2); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->setIncludeCharts(TRUE); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-radar.php b/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-radar.php deleted file mode 100644 index b8b427f3b12..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-radar.php +++ /dev/null @@ -1,154 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -$objPHPExcel = new PHPExcel(); -$objWorksheet = $objPHPExcel->getActiveSheet(); -$objWorksheet->fromArray( - array( - array('', 2010, 2011, 2012), - array('Jan', 47, 45, 71), - array('Feb', 56, 73, 86), - array('Mar', 52, 61, 69), - array('Apr', 40, 52, 60), - array('May', 42, 55, 71), - array('Jun', 58, 63, 76), - array('Jul', 53, 61, 89), - array('Aug', 46, 69, 85), - array('Sep', 62, 75, 81), - array('Oct', 51, 70, 96), - array('Nov', 55, 66, 89), - array('Dec', 68, 62, 0), - ) -); - - -// Set the Labels for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesLabels = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), // 2011 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), // 2012 -); -// Set the X-Axis Labels -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$xAxisTickValues = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$13', NULL, 12), // Jan to Dec - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$13', NULL, 12), // Jan to Dec -); -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$13', NULL, 12), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$13', NULL, 12), -); - -// Build the dataseries -$series = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_RADARCHART, // plotType - NULL, // plotGrouping (Radar charts don't have any grouping) - range(0, count($dataSeriesValues)-1), // plotOrder - $dataSeriesLabels, // plotLabel - $xAxisTickValues, // plotCategory - $dataSeriesValues, // plotValues - NULL, // smooth line - PHPExcel_Chart_DataSeries::STYLE_MARKER // plotStyle -); - -// Set up a layout object for the Pie chart -$layout = new PHPExcel_Chart_Layout(); - -// Set the series in the plot area -$plotArea = new PHPExcel_Chart_PlotArea($layout, array($series)); -// Set the chart legend -$legend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_RIGHT, NULL, false); - -$title = new PHPExcel_Chart_Title('Test Radar Chart'); - - -// Create the chart -$chart = new PHPExcel_Chart( - 'chart1', // name - $title, // title - $legend, // legend - $plotArea, // plotArea - true, // plotVisibleOnly - 0, // displayBlanksAs - NULL, // xAxisLabel - NULL // yAxisLabel - Radar charts don't have a Y-Axis -); - -// Set the position where the chart should appear in the worksheet -$chart->setTopLeftPosition('F2'); -$chart->setBottomRightPosition('M15'); - -// Add the chart to the worksheet -$objWorksheet->addChart($chart); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->setIncludeCharts(TRUE); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-scatter.php b/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-scatter.php deleted file mode 100644 index 250c61d7e4c..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-scatter.php +++ /dev/null @@ -1,138 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -$objPHPExcel = new PHPExcel(); -$objWorksheet = $objPHPExcel->getActiveSheet(); -$objWorksheet->fromArray( - array( - array('', 2010, 2011, 2012), - array('Q1', 12, 15, 21), - array('Q2', 56, 73, 86), - array('Q3', 52, 61, 69), - array('Q4', 30, 32, 0), - ) -); - -// Set the Labels for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesLabels = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), // 2010 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), // 2011 - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), // 2012 -); -// Set the X-Axis Labels -$xAxisTickValues = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$5', NULL, 4), // Q1 to Q4 -); -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$5', NULL, 4), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$5', NULL, 4), -); - -// Build the dataseries -$series = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART, // plotType - NULL, // plotGrouping (Scatter charts don't have any grouping) - range(0, count($dataSeriesValues)-1), // plotOrder - $dataSeriesLabels, // plotLabel - $xAxisTickValues, // plotCategory - $dataSeriesValues, // plotValues - NULL, // smooth line - PHPExcel_Chart_DataSeries::STYLE_LINEMARKER // plotStyle -); - -// Set the series in the plot area -$plotArea = new PHPExcel_Chart_PlotArea(NULL, array($series)); -// Set the chart legend -$legend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, NULL, false); - -$title = new PHPExcel_Chart_Title('Test Scatter Chart'); -$yAxisLabel = new PHPExcel_Chart_Title('Value ($k)'); - - -// Create the chart -$chart = new PHPExcel_Chart( - 'chart1', // name - $title, // title - $legend, // legend - $plotArea, // plotArea - true, // plotVisibleOnly - 0, // displayBlanksAs - NULL, // xAxisLabel - $yAxisLabel // yAxisLabel -); - -// Set the position where the chart should appear in the worksheet -$chart->setTopLeftPosition('A7'); -$chart->setBottomRightPosition('H20'); - -// Add the chart to the worksheet -$objWorksheet->addChart($chart); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->setIncludeCharts(TRUE); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-stock.php b/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-stock.php deleted file mode 100644 index b38fd518153..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/33chartcreate-stock.php +++ /dev/null @@ -1,151 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -$objPHPExcel = new PHPExcel(); -$objWorksheet = $objPHPExcel->getActiveSheet(); -$objWorksheet->fromArray( - array( - array('Counts', 'Max', 'Min', 'Min Threshold', 'Max Threshold' ), - array(10, 10, 5, 0, 50 ), - array(30, 20, 10, 0, 50 ), - array(20, 30, 15, 0, 50 ), - array(40, 10, 0, 0, 50 ), - array(100, 40, 5, 0, 50 ), - ), null, 'A1', true -); -$objWorksheet->getStyle('B2:E6')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_NUMBER_00); - - -// Set the Labels for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesLabels = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$B$1', NULL, 1), //Max / Open - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$C$1', NULL, 1), //Min / Close - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$1', NULL, 1), //Min Threshold / Min - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$E$1', NULL, 1), //Max Threshold / Max -); -// Set the X-Axis Labels -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$xAxisTickValues = array( - new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$A$2:$A$6', NULL, 5), // Counts -); -// Set the Data values for each data series we want to plot -// Datatype -// Cell reference for data -// Format Code -// Number of datapoints in series -// Data values -// Data Marker -$dataSeriesValues = array( - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$6', NULL, 5), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$6', NULL, 5), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$6', NULL, 5), - new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$E$2:$E$6', NULL, 5), -); - -// Build the dataseries -$series = new PHPExcel_Chart_DataSeries( - PHPExcel_Chart_DataSeries::TYPE_STOCKCHART, // plotType - null, // plotGrouping - if we set this to not null, then xlsx throws error - range(0, count($dataSeriesValues)-1), // plotOrder - $dataSeriesLabels, // plotLabel - $xAxisTickValues, // plotCategory - $dataSeriesValues // plotValues -); - -// Set the series in the plot area -$plotArea = new PHPExcel_Chart_PlotArea(NULL, array($series)); -// Set the chart legend -$legend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_RIGHT, NULL, false); - -$title = new PHPExcel_Chart_Title('Test Stock Chart'); -$xAxisLabel = new PHPExcel_Chart_Title('Counts'); -$yAxisLabel = new PHPExcel_Chart_Title('Values'); - -// Create the chart -$chart = new PHPExcel_Chart( - 'stock-chart', // name - $title, // title - $legend, // legend - $plotArea, // plotArea - true, // plotVisibleOnly - 0, // displayBlanksAs - $xAxisLabel, // xAxisLabel - $yAxisLabel // yAxisLabel -); - -// Set the position where the chart should appear in the worksheet -$chart->setTopLeftPosition('A7'); -$chart->setBottomRightPosition('H20'); - -// Add the chart to the worksheet -$objWorksheet->addChart($chart); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->setIncludeCharts(TRUE); -$filename = str_replace('.php', '.xlsx', __FILE__); -if(file_exists($filename)) { - unlink($filename); -} -$objWriter->save($filename); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/34chartupdate.php b/htdocs/includes/phpoffice/phpexcel/Examples/34chartupdate.php deleted file mode 100644 index cb586a31867..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/34chartupdate.php +++ /dev/null @@ -1,78 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - -if (!file_exists("33chartcreate-bar.xlsx")) { - exit("Please run 33chartcreate-bar.php first." . EOL); -} - -echo date('H:i:s') , " Load from Excel2007 file" , EOL; -$objReader = PHPExcel_IOFactory::createReader("Excel2007"); -$objReader->setIncludeCharts(TRUE); -$objPHPExcel = $objReader->load("33chartcreate-bar.xlsx"); - - -echo date('H:i:s') , " Update cell data values that are displayed in the chart" , EOL; -$objWorksheet = $objPHPExcel->getActiveSheet(); -$objWorksheet->fromArray( - array( - array(50-12, 50-15, 50-21), - array(50-56, 50-73, 50-86), - array(50-52, 50-61, 50-69), - array(50-30, 50-32, 50), - ), - NULL, - 'B2' -); - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->setIncludeCharts(TRUE); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/35chartrender.php b/htdocs/includes/phpoffice/phpexcel/Examples/35chartrender.php deleted file mode 100644 index f0e79636b11..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/35chartrender.php +++ /dev/null @@ -1,134 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** Include path **/ -set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/../Classes/'); - -/** PHPExcel_IOFactory */ -include 'PHPExcel/IOFactory.php'; - - -// Change these values to select the Rendering library that you wish to use -// and its directory location on your server -$rendererName = PHPExcel_Settings::CHART_RENDERER_JPGRAPH; -$rendererLibrary = 'jpgraph3.5.0b1/src/'; -$rendererLibraryPath = '/php/libraries/Charts/' . $rendererLibrary; - - -if (!PHPExcel_Settings::setChartRenderer( - $rendererName, - $rendererLibraryPath - )) { - die( - 'NOTICE: Please set the $rendererName and $rendererLibraryPath values' . - EOL . - 'at the top of this script as appropriate for your directory structure' - ); -} - - -$inputFileType = 'Excel2007'; -$inputFileNames = 'templates/32readwrite*[0-9].xlsx'; - - if ((isset($argc)) && ($argc > 1)) { - $inputFileNames = array(); - for($i = 1; $i < $argc; ++$i) { - $inputFileNames[] = dirname(__FILE__) . '/templates/' . $argv[$i]; - } -} else { - $inputFileNames = glob($inputFileNames); -} -foreach($inputFileNames as $inputFileName) { - $inputFileNameShort = basename($inputFileName); - - if (!file_exists($inputFileName)) { - echo date('H:i:s') , " File " , $inputFileNameShort , ' does not exist' , EOL; - continue; - } - - echo date('H:i:s') , " Load Test from $inputFileType file " , $inputFileNameShort , EOL; - - $objReader = PHPExcel_IOFactory::createReader($inputFileType); - $objReader->setIncludeCharts(TRUE); - $objPHPExcel = $objReader->load($inputFileName); - - - echo date('H:i:s') , " Iterate worksheets looking at the charts" , EOL; - foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) { - $sheetName = $worksheet->getTitle(); - echo 'Worksheet: ' , $sheetName , EOL; - - $chartNames = $worksheet->getChartNames(); - if(empty($chartNames)) { - echo ' There are no charts in this worksheet' , EOL; - } else { - natsort($chartNames); - foreach($chartNames as $i => $chartName) { - $chart = $worksheet->getChartByName($chartName); - if (!is_null($chart->getTitle())) { - $caption = '"' . implode(' ',$chart->getTitle()->getCaption()) . '"'; - } else { - $caption = 'Untitled'; - } - echo ' ' , $chartName , ' - ' , $caption , EOL; - echo str_repeat(' ',strlen($chartName)+3); - - $jpegFile = '35'.str_replace('.xlsx', '.jpg', substr($inputFileNameShort,2)); - if (file_exists($jpegFile)) { - unlink($jpegFile); - } - try { - $chart->render($jpegFile); - } catch (Exception $e) { - echo 'Error rendering chart: ',$e->getMessage(); - } - } - } - } - - - $objPHPExcel->disconnectWorksheets(); - unset($objPHPExcel); -} - -// Echo memory peak usage -echo date('H:i:s') , ' Peak memory usage: ' , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done rendering charts as images" , EOL; -echo 'Image files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/36chartreadwriteHTML.php b/htdocs/includes/phpoffice/phpexcel/Examples/36chartreadwriteHTML.php deleted file mode 100644 index b4bae11cba2..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/36chartreadwriteHTML.php +++ /dev/null @@ -1,151 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** Include path **/ -set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/../Classes/'); - -/** PHPExcel_IOFactory */ -include 'PHPExcel/IOFactory.php'; - - -// Change these values to select the Rendering library that you wish to use -// and its directory location on your server -$rendererName = PHPExcel_Settings::CHART_RENDERER_JPGRAPH; -$rendererLibrary = 'jpgraph3.5.0b1/src'; -$rendererLibraryPath = '/php/libraries/Charts/' . $rendererLibrary; - - -if (!PHPExcel_Settings::setChartRenderer( - $rendererName, - $rendererLibraryPath - )) { - die( - 'NOTICE: Please set the $rendererName and $rendererLibraryPath values' . - EOL . - 'at the top of this script as appropriate for your directory structure' - ); -} - - -$inputFileType = 'Excel2007'; -$inputFileNames = 'templates/36write*.xlsx'; - -if ((isset($argc)) && ($argc > 1)) { - $inputFileNames = array(); - for($i = 1; $i < $argc; ++$i) { - $inputFileNames[] = dirname(__FILE__) . '/templates/' . $argv[$i]; - } -} else { - $inputFileNames = glob($inputFileNames); -} -foreach($inputFileNames as $inputFileName) { - $inputFileNameShort = basename($inputFileName); - - if (!file_exists($inputFileName)) { - echo date('H:i:s') , " File " , $inputFileNameShort , ' does not exist' , EOL; - continue; - } - - echo date('H:i:s') , " Load Test from $inputFileType file " , $inputFileNameShort , EOL; - - $objReader = PHPExcel_IOFactory::createReader($inputFileType); - $objReader->setIncludeCharts(TRUE); - $objPHPExcel = $objReader->load($inputFileName); - - - echo date('H:i:s') , " Iterate worksheets looking at the charts" , EOL; - foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) { - $sheetName = $worksheet->getTitle(); - echo 'Worksheet: ' , $sheetName , EOL; - - $chartNames = $worksheet->getChartNames(); - if(empty($chartNames)) { - echo ' There are no charts in this worksheet' , EOL; - } else { - natsort($chartNames); - foreach($chartNames as $i => $chartName) { - $chart = $worksheet->getChartByName($chartName); - if (!is_null($chart->getTitle())) { - $caption = '"' . implode(' ',$chart->getTitle()->getCaption()) . '"'; - } else { - $caption = 'Untitled'; - } - echo ' ' , $chartName , ' - ' , $caption , EOL; - echo str_repeat(' ',strlen($chartName)+3); - $groupCount = $chart->getPlotArea()->getPlotGroupCount(); - if ($groupCount == 1) { - $chartType = $chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotType(); - echo ' ' , $chartType , EOL; - } else { - $chartTypes = array(); - for($i = 0; $i < $groupCount; ++$i) { - $chartTypes[] = $chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType(); - } - $chartTypes = array_unique($chartTypes); - if (count($chartTypes) == 1) { - $chartType = 'Multiple Plot ' . array_pop($chartTypes); - echo ' ' , $chartType , EOL; - } elseif (count($chartTypes) == 0) { - echo ' *** Type not yet implemented' , EOL; - } else { - echo ' Combination Chart' , EOL; - } - } - } - } - } - - - $outputFileName = str_replace('.xlsx', '.html', basename($inputFileName)); - - echo date('H:i:s') , " Write Tests to HTML file " , EOL; - $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'HTML'); - $objWriter->setIncludeCharts(TRUE); - $objWriter->save($outputFileName); - echo date('H:i:s') , " File written to " , $outputFileName , EOL; - - $objPHPExcel->disconnectWorksheets(); - unset($objPHPExcel); -} - -// Echo memory peak usage -echo date('H:i:s') , ' Peak memory usage: ' , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/36chartreadwritePDF.php b/htdocs/includes/phpoffice/phpexcel/Examples/36chartreadwritePDF.php deleted file mode 100644 index 10d62cd04ba..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/36chartreadwritePDF.php +++ /dev/null @@ -1,174 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** - * PHPExcel - * - * Copyright (C) 2006 - 2014 PHPExcel - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * @category PHPExcel - * @package PHPExcel - * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version ##VERSION##, ##DATE## - */ - -/** Include path **/ -set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/../Classes/'); - -/** PHPExcel_IOFactory */ -include 'PHPExcel/IOFactory.php'; - - -// Change these values to select the Rendering library that you wish to use -// for PDF files, and its directory location on your server -//$rendererName = PHPExcel_Settings::PDF_RENDERER_TCPDF; -$rendererName = PHPExcel_Settings::PDF_RENDERER_MPDF; -//$rendererName = PHPExcel_Settings::PDF_RENDERER_DOMPDF; -//$rendererLibrary = 'tcPDF5.9'; -$rendererLibrary = 'mPDF5.4'; -//$rendererLibrary = 'domPDF0.6.0beta3'; -$rendererLibraryPath = '/php/libraries/PDF/' . $rendererLibrary; - - -if (!PHPExcel_Settings::setPdfRenderer( - $rendererName, - $rendererLibraryPath - )) { - die( - 'NOTICE: Please set the $rendererName and $rendererLibraryPath values' . - EOL . - 'at the top of this script as appropriate for your directory structure' - ); -} - - -// Change these values to select the Rendering library that you wish to use -// for Chart images, and its directory location on your server -$rendererName = PHPExcel_Settings::CHART_RENDERER_JPGRAPH; -$rendererLibrary = 'jpgraph3.5.0b1/src'; -$rendererLibraryPath = '/php/libraries/Charts/' . $rendererLibrary; - - -if (!PHPExcel_Settings::setChartRenderer( - $rendererName, - $rendererLibraryPath - )) { - die( - 'NOTICE: Please set the $rendererName and $rendererLibraryPath values' . - EOL . - 'at the top of this script as appropriate for your directory structure' - ); -} - - -$inputFileType = 'Excel2007'; -$inputFileNames = 'templates/36write*.xlsx'; - -if ((isset($argc)) && ($argc > 1)) { - $inputFileNames = array(); - for($i = 1; $i < $argc; ++$i) { - $inputFileNames[] = dirname(__FILE__) . '/templates/' . $argv[$i]; - } -} else { - $inputFileNames = glob($inputFileNames); -} -foreach($inputFileNames as $inputFileName) { - $inputFileNameShort = basename($inputFileName); - - if (!file_exists($inputFileName)) { - echo date('H:i:s') , " File " , $inputFileNameShort , ' does not exist' , EOL; - continue; - } - - echo date('H:i:s') , " Load Test from $inputFileType file " , $inputFileNameShort , EOL; - - $objReader = PHPExcel_IOFactory::createReader($inputFileType); - $objReader->setIncludeCharts(TRUE); - $objPHPExcel = $objReader->load($inputFileName); - - - echo date('H:i:s') , " Iterate worksheets looking at the charts" , EOL; - foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) { - $sheetName = $worksheet->getTitle(); - echo 'Worksheet: ' , $sheetName , EOL; - - $chartNames = $worksheet->getChartNames(); - if(empty($chartNames)) { - echo ' There are no charts in this worksheet' , EOL; - } else { - natsort($chartNames); - foreach($chartNames as $i => $chartName) { - $chart = $worksheet->getChartByName($chartName); - if (!is_null($chart->getTitle())) { - $caption = '"' . implode(' ',$chart->getTitle()->getCaption()) . '"'; - } else { - $caption = 'Untitled'; - } - echo ' ' , $chartName , ' - ' , $caption , EOL; - echo str_repeat(' ',strlen($chartName)+3); - $groupCount = $chart->getPlotArea()->getPlotGroupCount(); - if ($groupCount == 1) { - $chartType = $chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotType(); - echo ' ' , $chartType , EOL; - } else { - $chartTypes = array(); - for($i = 0; $i < $groupCount; ++$i) { - $chartTypes[] = $chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType(); - } - $chartTypes = array_unique($chartTypes); - if (count($chartTypes) == 1) { - $chartType = 'Multiple Plot ' . array_pop($chartTypes); - echo ' ' , $chartType , EOL; - } elseif (count($chartTypes) == 0) { - echo ' *** Type not yet implemented' , EOL; - } else { - echo ' Combination Chart' , EOL; - } - } - } - } - } - - - $outputFileName = str_replace('.xlsx', '.pdf', basename($inputFileName)); - - echo date('H:i:s') , " Write Tests to HTML file " , EOL; - $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF'); - $objWriter->setIncludeCharts(TRUE); - $objWriter->save($outputFileName); - echo date('H:i:s') , " File written to " , $outputFileName , EOL; - - $objPHPExcel->disconnectWorksheets(); - unset($objPHPExcel); -} - -// Echo memory peak usage -echo date('H:i:s') , ' Peak memory usage: ' , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/37page_layout_view.php b/htdocs/includes/phpoffice/phpexcel/Examples/37page_layout_view.php deleted file mode 100644 index 070f512a2a7..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/37page_layout_view.php +++ /dev/null @@ -1,83 +0,0 @@ -'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("PHPOffice") - ->setLastModifiedBy("PHPOffice") - ->setTitle("PHPExcel Test Document") - ->setSubject("PHPExcel Test Document") - ->setDescription("Test document for PHPExcel, generated using PHP classes.") - ->setKeywords("Office PHPExcel php") - ->setCategory("Test result file"); - - -// Add some data -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A1', 'Hello') - ->setCellValue('B2', 'world!'); - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - -// Set the page layout view as page layout -$objPHPExcel->getActiveSheet()->getSheetView()->setView(PHPExcel_Worksheet_SheetView::SHEETVIEW_PAGE_LAYOUT); - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -// Save Excel5 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/38cloneWorksheet.php b/htdocs/includes/phpoffice/phpexcel/Examples/38cloneWorksheet.php deleted file mode 100644 index 901b887eeb9..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/38cloneWorksheet.php +++ /dev/null @@ -1,118 +0,0 @@ -'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("PHPExcel Test Document") - ->setSubject("PHPExcel Test Document") - ->setDescription("Test document for PHPExcel, generated using PHP classes.") - ->setKeywords("office PHPExcel php") - ->setCategory("Test result file"); - - -// Add some data -echo date('H:i:s') , " Add some data" , EOL; -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A1', 'Hello') - ->setCellValue('B2', 'world!') - ->setCellValue('C1', 'Hello') - ->setCellValue('D2', 'world!'); - -// Miscellaneous glyphs, UTF-8 -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A4', 'Miscellaneous glyphs') - ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç'); - - -$objPHPExcel->getActiveSheet()->setCellValue('A8',"Hello\nWorld"); -$objPHPExcel->getActiveSheet()->getRowDimension(8)->setRowHeight(-1); -$objPHPExcel->getActiveSheet()->getStyle('A8')->getAlignment()->setWrapText(true); - - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Simple'); - - -// Clone worksheet -echo date('H:i:s') , " Clone worksheet" , EOL; -$clonedSheet = clone $objPHPExcel->getActiveSheet(); -$clonedSheet - ->setCellValue('A1', 'Goodbye') - ->setCellValue('A2', 'cruel') - ->setCellValue('C1', 'Goodbye') - ->setCellValue('C2', 'cruel'); - -// Rename cloned worksheet -echo date('H:i:s') , " Rename cloned worksheet" , EOL; -$clonedSheet->setTitle('Simple Clone'); -$objPHPExcel->addSheet($clonedSheet); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/39dropdown.php b/htdocs/includes/phpoffice/phpexcel/Examples/39dropdown.php deleted file mode 100644 index 5dadc09922f..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/39dropdown.php +++ /dev/null @@ -1,175 +0,0 @@ -'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties() - ->setCreator("PHPOffice") - ->setLastModifiedBy("PHPOffice") - ->setTitle("PHPExcel Test Document") - ->setSubject("PHPExcel Test Document") - ->setDescription("Test document for PHPExcel, generated using PHP classes.") - ->setKeywords("Office PHPExcel php") - ->setCategory("Test result file"); - - -function transpose($value) { - return array($value); -} - -// Add some data -$continentColumn = 'D'; -$column = 'F'; - -// Set data for dropdowns -foreach(glob('./data/continents/*') as $key => $filename) { - $continent = pathinfo($filename, PATHINFO_FILENAME); - echo "Loading $continent", EOL; - $continent = str_replace(' ','_',$continent); - $countries = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); - $countryCount = count($countries); - - // Transpose $countries from a row to a column array - $countries = array_map('transpose', $countries); - $objPHPExcel->getActiveSheet() - ->fromArray($countries, null, $column . '1'); - $objPHPExcel->addNamedRange( - new PHPExcel_NamedRange( - $continent, - $objPHPExcel->getActiveSheet(), $column . '1:' . $column . $countryCount - ) - ); - $objPHPExcel->getActiveSheet() - ->getColumnDimension($column) - ->setVisible(false); - - $objPHPExcel->getActiveSheet() - ->setCellValue($continentColumn . ($key+1), $continent); - - ++$column; -} - -// Hide the dropdown data -$objPHPExcel->getActiveSheet() - ->getColumnDimension($continentColumn) - ->setVisible(false); - -$objPHPExcel->addNamedRange( - new PHPExcel_NamedRange( - 'Continents', - $objPHPExcel->getActiveSheet(), $continentColumn . '1:' . $continentColumn . ($key+1) - ) -); - - -// Set selection cells -$objPHPExcel->getActiveSheet() - ->setCellValue('A1', 'Continent:'); -$objPHPExcel->getActiveSheet() - ->setCellValue('B1', 'Select continent'); -$objPHPExcel->getActiveSheet() - ->setCellValue('B3', '=' . $column . 1); -$objPHPExcel->getActiveSheet() - ->setCellValue('B3', 'Select country'); -$objPHPExcel->getActiveSheet() - ->getStyle('A1:A3') - ->getFont()->setBold(true); - -// Set linked validators -$objValidation = $objPHPExcel->getActiveSheet() - ->getCell('B1') - ->getDataValidation(); -$objValidation->setType( PHPExcel_Cell_DataValidation::TYPE_LIST ) - ->setErrorStyle( PHPExcel_Cell_DataValidation::STYLE_INFORMATION ) - ->setAllowBlank(false) - ->setShowInputMessage(true) - ->setShowErrorMessage(true) - ->setShowDropDown(true) - ->setErrorTitle('Input error') - ->setError('Continent is not in the list.') - ->setPromptTitle('Pick from the list') - ->setPrompt('Please pick a continent from the drop-down list.') - ->setFormula1('=Continents'); - -$objPHPExcel->getActiveSheet() - ->setCellValue('A3', 'Country:'); -$objPHPExcel->getActiveSheet() - ->getStyle('A3') - ->getFont()->setBold(true); - -$objValidation = $objPHPExcel->getActiveSheet() - ->getCell('B3') - ->getDataValidation(); -$objValidation->setType( PHPExcel_Cell_DataValidation::TYPE_LIST ) - ->setErrorStyle( PHPExcel_Cell_DataValidation::STYLE_INFORMATION ) - ->setAllowBlank(false) - ->setShowInputMessage(true) - ->setShowErrorMessage(true) - ->setShowDropDown(true) - ->setErrorTitle('Input error') - ->setError('Country is not in the list.') - ->setPromptTitle('Pick from the list') - ->setPrompt('Please pick a country from the drop-down list.') - ->setFormula1('=INDIRECT($B$1)'); - - -$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(12); -$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(30); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - -// Save Excel 2007 file -// This linked validation list method only seems to work for Excel2007, not for Excel5 -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/40duplicateStyle.php b/htdocs/includes/phpoffice/phpexcel/Examples/40duplicateStyle.php deleted file mode 100644 index be31951a492..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/40duplicateStyle.php +++ /dev/null @@ -1,51 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); -$worksheet = $objPHPExcel->getActiveSheet(); - -echo date('H:i:s') , " Create styles array" , EOL; -$styles = array(); -for ($i = 0; $i < 10; $i++) { - $style = new PHPExcel_Style(); - $style->getFont()->setSize($i + 4); - $styles[] = $style; -} - -echo date('H:i:s') , " Add data (begin)" , EOL; -$t = microtime(true); -for ($col = 0; $col < 50; $col++) { - for ($row = 0; $row < 100; $row++) { - $str = ($row + $col); - $style = $styles[$row % 10]; - $coord = PHPExcel_Cell::stringFromColumnIndex($col) . ($row + 1); - $worksheet->setCellValue($coord, $str); - $worksheet->duplicateStyle($style, $coord); - } -} -$d = microtime(true) - $t; -echo date('H:i:s') , " Add data (end), time: " . round($d, 2) . " s", EOL; - - -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; - - -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -echo date('H:i:s') , " Done writing file" , EOL; -echo 'File has been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/41password.php b/htdocs/includes/phpoffice/phpexcel/Examples/41password.php deleted file mode 100644 index 7b03e4f9a1f..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/41password.php +++ /dev/null @@ -1,84 +0,0 @@ -'); - -date_default_timezone_set('Europe/London'); - -include "05featuredemo.inc.php"; - -/** Include PHPExcel_IOFactory */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php'; - - -// Set password against the spreadsheet file -$objPHPExcel->getSecurity()->setLockWindows(true); -$objPHPExcel->getSecurity()->setLockStructure(true); -$objPHPExcel->getSecurity()->setWorkbookPassword('secret'); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/42richText.php b/htdocs/includes/phpoffice/phpexcel/Examples/42richText.php deleted file mode 100644 index 4e99b853544..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/42richText.php +++ /dev/null @@ -1,159 +0,0 @@ -'); - -/** Include PHPExcel */ -require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; - - -// Create new PHPExcel object -echo date('H:i:s') , " Create new PHPExcel object" , EOL; -$objPHPExcel = new PHPExcel(); - -// Set document properties -echo date('H:i:s') , " Set document properties" , EOL; -$objPHPExcel->getProperties()->setCreator("Maarten Balliauw") - ->setLastModifiedBy("Maarten Balliauw") - ->setTitle("PHPExcel Test Document") - ->setSubject("PHPExcel Test Document") - ->setDescription("Test document for PHPExcel, generated using PHP classes.") - ->setKeywords("office PHPExcel php") - ->setCategory("Test result file"); - - -// Add some data -echo date('H:i:s') , " Add some data" , EOL; - -$html1=' -

My very first example of rich text
generated from html markup

-

- -This block contains an italicized word; -while this block uses an underline. - -

-

-I want to eat healthy foodpizza. - -'; - -$html2='

- - 100°C is a hot temperature - -
- - 10°F is cold - -

'; - -$html3='23 equals 8'; - -$html4='H2SO4 is the chemical formula for Sulphuric acid'; - - -$wizard = new PHPExcel_Helper_HTML; -$richText = $wizard->toRichTextObject($html1); - -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A1', $richText); - -$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(48); -$objPHPExcel->getActiveSheet()->getRowDimension(1)->setRowHeight(-1); -$objPHPExcel->getActiveSheet()->getStyle('A1') - ->getAlignment() - ->setWrapText(true); - -$richText = $wizard->toRichTextObject($html2); - -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A2', $richText); - -$objPHPExcel->getActiveSheet()->getRowDimension(1)->setRowHeight(-1); -$objPHPExcel->getActiveSheet()->getStyle('A2') - ->getAlignment() - ->setWrapText(true); - -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A3', $wizard->toRichTextObject($html3)); - -$objPHPExcel->setActiveSheetIndex(0) - ->setCellValue('A4', $wizard->toRichTextObject($html4)); - - -// Rename worksheet -echo date('H:i:s') , " Rename worksheet" , EOL; -$objPHPExcel->getActiveSheet()->setTitle('Simple'); - - -// Set active sheet index to the first sheet, so Excel opens this as the first sheet -$objPHPExcel->setActiveSheetIndex(0); - - -// Save Excel 2007 file -echo date('H:i:s') , " Write to Excel2007 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); -$objWriter->save(str_replace('.php', '.xlsx', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Save Excel 95 file -echo date('H:i:s') , " Write to Excel5 format" , EOL; -$callStartTime = microtime(true); - -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; - -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL; -echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL; - -// Echo done -echo date('H:i:s') , " Done writing files" , EOL; -echo 'Files have been created in ' , getcwd() , EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/Excel2003XMLReader.php b/htdocs/includes/phpoffice/phpexcel/Examples/Excel2003XMLReader.php deleted file mode 100644 index 99d6df80728..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/Excel2003XMLReader.php +++ /dev/null @@ -1,61 +0,0 @@ -load("Excel2003XMLTest.xml"); - - -$callEndTime = microtime(true); -$callTime = $callEndTime - $callStartTime; -echo 'Call time to read Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , PHP_EOL; -// Echo memory usage -echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , PHP_EOL; - - -echo date('H:i:s') , " Write to Excel5 format" , PHP_EOL; -$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); -$objWriter->save(str_replace('.php', '.xls', __FILE__)); -echo date('H:i:s') , " File written to " , str_replace('.php', '.xls', __FILE__) , PHP_EOL; - - -// Echo memory peak usage -echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , PHP_EOL; - -// Echo done -echo date('H:i:s') , " Done writing file" , PHP_EOL; diff --git a/htdocs/includes/phpoffice/phpexcel/Examples/Excel2003XMLTest.xml b/htdocs/includes/phpoffice/phpexcel/Examples/Excel2003XMLTest.xml deleted file mode 100644 index fb2d305c379..00000000000 --- a/htdocs/includes/phpoffice/phpexcel/Examples/Excel2003XMLTest.xml +++ /dev/null @@ -1 +0,0 @@ -3#0000004#0000ff5#0080006#00ccff7#8000808#9933669#c0c0c010#c4751211#ccffcc12#ddbc7d13#ff000014#ff00ff15#ff660016#ff990017#ff99cc18#ffff0090001386024075FalseFalse - - - - - - - - - - - - - - - - - - - - - - - - - - - - Test String 1 - 1 - 5 - A - E - 6 - AE - - - Test - String 2 - 2 - 6 - B - F - 8 - BF - - - Test #3 - 3 - 7 - C - G - 10 - CG - - - Test with (") in string - 4 - 8 - D - H - 12 - DH - - - 10 - 26 - 36 - - - 1.23 - 1 - - - - 2.34 - 0 - - - 3.45 - - - - 1960-12-19T00:00:00.000 - TOP - #N/A - - - 1.5 - #DIV/0! - - - BOTTOM - - - LEFT - - - RIGHT - - - - BOX - - Test Column 1 - - - Test Column 2 - - - Test Column 3 - -
- - -
-